python进阶(二)~~~函数进阶
函数进阶
1、递归函数:在函数体中调用自身;一定要设置退出的边界条件;
def func_add(i): if i==1: return i res=i+func_add(i-1) return res print(func_add(3))
print(sys.getrecursionlimit()) # 查看递归边界,超出时会报错
sys.setrecursionlimit(1000) # 手动设置递归边界
递归函数存在大量的重复计算数据,使用缓存可以保留上次计算的结果,大大节省执行时间。
from functools import lru_cache @lru_cache(maxsize=128,typed=False) def func_add(i): if i<=2: return 1 res=func_add(i-1)+func_add(i-2) return res print(func_add(100))
2、纯函数
函数的返回值只与函数内部参数有关,不受外部环境(如全局变量)影响;
函数调用时不会产生副作用,例如改变外部环境(如全局变量,文件读写);
相同的输入保证有相同的输出;
常用的内置函数:map、filter、zip
def func_map(n): return n*1000/3 res=map(func_map,[1,2,3,4]) #map(fun, li): 第一个参数为函数,第二个参数为可迭代对象;对可迭代对象中的每个元素当做参数传入fun函数中批量处理并返回 print(list(res)) #过滤器 def func_filter(n): return n>=5 res2=filter(func_filter,[1,2,3,4,6,7]) print(list(res2)) #聚合打包 title=['name','age','sex'] data=['musen','18','男'] num=[1,2,3] res3=zip(title,data) print(dict(res3)) # 整合为字典 res4=zip(title,data,num) # 还可接收多个可迭代对象,整合,以最短长度为准
3、匿名函数
匿名函数格式: lambda 参数:表达式(返回值),匿名函数即用即销毁,不占用内存
res2=filter(lambda n:n>5,li)
li2=[lambda i:i*9 for i in range(8)]
print((lambda x,y:x+y)(3,5))
print((lambda x,y='world':x+y)('hello'))
4、偏函数:固定参数,减少参数传递
from functools import partial def func(a,b,c): print(a,b,c) func(11,22,33) func(11,44,55) #有相同参数时可使用偏函数,固定 func11_cp = partial(func,11) #再次调用时,即可减少参数传递 func11_cp(22,33)