递归函数
在函数中调用函数自身;递归函数一定要写终止条件,否则将产生无限递归即死循环。
# 阶乘 6*5*4*3*2*1 def func(n): if n == 1: return 1 else: return n * func(n - 1) # 累加把*换成+即可 print(func(6)) # 6*5*4*3*2*1 = 720 import sys # 获取最大递归深度 res = sys.getrecursionlimit() print(res) # 1000 # 可以通过setrecursionlimit去设置递归最大深度 # 但是要考虑内存能否满足条件,内存满了就会停止,一般不会修改这个 # sys.setrecursionlimit(5000) # Python中递归效率比较低,不推荐使用递归 # 每次调用函数都需要临时开辟一块内存去保存函数运行中的数据,无论函数是否相同的参数去重复调用 # 直到递归全部运行完毕才去释放内存 # 针对这种情况可以使用 缓存装饰器 去提升递归函数的运行效率 # 优化运行机制,把调用函数对于相同参数重复调用的,无需重新函数计算(无须新开辟内存),直接返回之前缓存的返回值 # 如果必须使用递归函数去解决问题时,一定要使用缓存装饰器,可以大大提高运行效率 from functools import lru_cache @lru_cache(maxsize=128) # maxsize参数指调用时递归占多少内存 def func_lru(n): if n == 1 or n == 2 or n == 3: return n else: return func(n - 1) + func(n - 2) + func(n - 3) func_lru(50)
纯函数
函数的返回结果只依赖于它的参数,并且在执行过程中没有副作用。
三个原则
1、变量都只在函数作用域内获取,或者作为函数的参数传入
2、相同的输入保证相同的输出
3、不会产生副作用,不会改变被传入的数据或者全局变量的其他数据
函数的副作用
访问了函数外的数据,对外部数据进行了操作改变了系统环境
纯函数的作用就是降低代码的耦合度(代码的耦合度,是指代码中的单元代码的紧密程度,其中一个单元代码的更改对其它单元代码的影响力与作用)
# 纯函数 def func(a, b): return a + b # 不是纯函数,使用了外部变量 c = 100 def func1(a, b): return a + b + c # 不是纯函数,调用函数后就改变了外部数据 li = [] def func2(a, b): li.append(a) li.append(b) return a + b
匿名函数(lambda 表达式)
语法 lambda 参数: 返回值