lambda函数

为了解决一些功能很简单的需求而设计的一句话函数
格式:
函数名=lambda参数:返回值,实参

  • 参数可以有多个,用逗号隔开
  • 匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
  • 返回值和正常的函数一样可以是任意数据类型

lambda函数的基本使用方式

  1. ret = map(lambda x : x**2, [1, 2, 3, 4])
  2. for i in ret:
  3. print(i)
  4. cal = lambda x : x**3
  5. ret = map(cal, [1, 2, 3, 4])

两种写法等价

递归

  • 在一个函数里,调用函数本身
  • 为了放置递归无限进行,所以在递归函数里,必须要有函数终止条件
  • 递归的最大深度由计算机性能体现
  • 一般python的最大递归深度的最大值为997
  • 可以使用_import _sys<br />_print_(sys.setrecursionlimit(10000))的方式对程序的最大递归深度进行修改
  1. def foo(n):
  2. if n==4:
  3. return
  4. print(n)
  5. n += 1
  6. foo(n)
  7. foo(1)

汉诺塔问题

我们只需要考虑
基本的代码实现

  1. def move(n, a, b, c):
  2. '''n表示层数
  3. a表示原来的柱子
  4. b表示空闲柱子
  5. c表示目的柱子
  6. '''
  7. if n == 1:
  8. print(a, '-->', c)
  9. else:
  10. move(n-1, a, c, b)
  11. print(a, '-->', c)
  12. move(n-1, b, a, c)
  13. move(3, 'a', 'b', 'c')

一些常见的递归问题的程序

  1. menu = { '山东': { '青岛': ['四方', '黄岛', '崂山', '李沧', '城阳'], '济南': ['历城', '槐荫', '高新', '长青', '章丘'], '烟台': ['龙口', '莱山', '牟平', '蓬莱', '招远'] },'江苏': { '苏州': ['沧浪', '相城', '平江', '吴中', '昆山'], '南京': ['白下', '秦淮', '浦口', '栖霞', '江宁'], '无锡': ['崇安', '南长', '北塘', '锡山', '江阴'] },'浙江': { '杭州': ['西湖', '江干', '下城', '上城', '滨江'], '宁波': ['海曙', '江东', '江北', '镇海', '余姚'], '温州': ['鹿城', '龙湾', '乐清', '瑞安', '永嘉'] },'安徽': { '合肥': ['蜀山', '庐阳', '包河', '经开', '新站'], '芜湖': ['镜湖', '鸠江', '无为', '三山', '南陵'], '蚌埠': ['蚌山', '龙子湖', '淮上', '怀远', '固镇'] },'广东': { '深圳': ['罗湖', '福田', '南山', '宝安', '布吉'], '广州': ['天河', '珠海', '越秀', '白云', '黄埔'], '东莞': ['莞城', '长安', '虎门', '万江', '大朗'] },'测试': {} }
  2. def tree_menu(dic1):
  3. while True:
  4. for k in dic1:
  5. print(k)
  6. key = input('input>>').strip()
  7. if key =='b' or key=='q':
  8. return key
  9. elif key in dic1.keys() and dic1[key]:
  10. ret = tree_menu(dic1[key])
  11. if ret == 'q':
  12. return 'q'
  13. tree_menu(menu)

该程序中的return会结束当前的函数跳入到上一层的函数中去,并不会直接结束所有的程序

二分法

  1. l = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55, 56, 66, 67, 69, 72, 76, 82, 83, 88]
  2. ##二分法问题
  3. def search(num, l, start=None, end=None,):
  4. start = start if start else 0
  5. end = len(l)-1 if end is None else end
  6. mid = (end-start)//2 + start
  7. if start > end:
  8. return None
  9. elif l[mid] > num:
  10. return search(num, l, start, mid-1)
  11. elif l[mid] < num:
  12. return search(num, l, mid+1, end)
  13. elif l[mid] == num:
  14. return mid
  15. ret = search(18, l)
  16. print(ret)