lambda函数
为了解决一些功能很简单的需求而设计的一句话函数
格式:
函数名=lambda参数:返回值,实参
- 参数可以有多个,用逗号隔开
- 匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
- 返回值和正常的函数一样可以是任意数据类型
lambda函数的基本使用方式
ret = map(lambda x : x**2, [1, 2, 3, 4])
for i in ret:
print(i)
cal = lambda x : x**3
ret = map(cal, [1, 2, 3, 4])
递归
- 在一个函数里,调用函数本身
- 为了放置递归无限进行,所以在递归函数里,必须要有函数终止条件
- 递归的最大深度由计算机性能体现
- 一般python的最大递归深度的最大值为997
- 可以使用
_import _sys<br />_print_(sys.setrecursionlimit(10000))
的方式对程序的最大递归深度进行修改
def foo(n):
if n==4:
return
print(n)
n += 1
foo(n)
foo(1)
汉诺塔问题
我们只需要考虑
基本的代码实现
def move(n, a, b, c):
'''n表示层数
a表示原来的柱子
b表示空闲柱子
c表示目的柱子
'''
if n == 1:
print(a, '-->', c)
else:
move(n-1, a, c, b)
print(a, '-->', c)
move(n-1, b, a, c)
move(3, 'a', 'b', 'c')
一些常见的递归问题的程序
menu = { '山东': { '青岛': ['四方', '黄岛', '崂山', '李沧', '城阳'], '济南': ['历城', '槐荫', '高新', '长青', '章丘'], '烟台': ['龙口', '莱山', '牟平', '蓬莱', '招远'] },'江苏': { '苏州': ['沧浪', '相城', '平江', '吴中', '昆山'], '南京': ['白下', '秦淮', '浦口', '栖霞', '江宁'], '无锡': ['崇安', '南长', '北塘', '锡山', '江阴'] },'浙江': { '杭州': ['西湖', '江干', '下城', '上城', '滨江'], '宁波': ['海曙', '江东', '江北', '镇海', '余姚'], '温州': ['鹿城', '龙湾', '乐清', '瑞安', '永嘉'] },'安徽': { '合肥': ['蜀山', '庐阳', '包河', '经开', '新站'], '芜湖': ['镜湖', '鸠江', '无为', '三山', '南陵'], '蚌埠': ['蚌山', '龙子湖', '淮上', '怀远', '固镇'] },'广东': { '深圳': ['罗湖', '福田', '南山', '宝安', '布吉'], '广州': ['天河', '珠海', '越秀', '白云', '黄埔'], '东莞': ['莞城', '长安', '虎门', '万江', '大朗'] },'测试': {} }
def tree_menu(dic1):
while True:
for k in dic1:
print(k)
key = input('input>>').strip()
if key =='b' or key=='q':
return key
elif key in dic1.keys() and dic1[key]:
ret = tree_menu(dic1[key])
if ret == 'q':
return 'q'
tree_menu(menu)
该程序中的return会结束当前的函数跳入到上一层的函数中去,并不会直接结束所有的程序
二分法
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]
##二分法问题
def search(num, l, start=None, end=None,):
start = start if start else 0
end = len(l)-1 if end is None else end
mid = (end-start)//2 + start
if start > end:
return None
elif l[mid] > num:
return search(num, l, start, mid-1)
elif l[mid] < num:
return search(num, l, mid+1, end)
elif l[mid] == num:
return mid
ret = search(18, l)
print(ret)