一、递归函数
1、含义:一个含直接或间接调用本函数语句的函数被称之为递归函数(函数直接或间接调用函数本身,则该函数称为递归函数)
2、递归函数需要满足以下两个条件:
1)在每一次调用自己时,必须是(在某种意义上)更接近于解;
2)必须有一个终止处理或者计算的准则
阶层的递归函数
def factorial(n):
if(n == 0 or n == 1):
return 1
else:
return n * factorial(n-1)
3、最大递归边界
1)默认的最大递归边界是1000次
#获取最大递归值
import sys
sys.getrecursionlimit()
#设置最大递归深度
sys.setrecursionlimit(5000)
2)从内存方面讲解递归效率问题
a、python中不推荐使用递归,因为递归吃内存
b、递归调用自身时,都会占用一小块内存存储函数中的变量以及结果,使用缓存功能装饰器可以缓存相同参数的函数调用结果,节省内存,提高运行速率
4、通过缓存解决最大递归限制的问题
1、python的functools模块中提供了很多高阶函数的操作
2、lru_cache:缓存功能装饰器
a、能够缓存相同参数的函数调用结果,可以节约高开销或I/O函数的调用时间
b、通过lru_cache装饰递归函数
二、匿名函数
1、语法
lambda 参数:返回值
2、使用场景
a、用来定义一些比较简单,不会重复使用的函数,
b、函数当作参数使用
def func(n):
return n * 3
以上创建匿名函数:
lambda n : n*3
c、匿名函数结合三目运算符
1)lambda x: x * 10 if x < 5 else x * 2
参入的参数如果小于5就输出x*10,否则输出x * 2
2)可处理一些简单的判断逻辑
三、内置函数
1、filter内置函数
过滤函数,接收参数为两个参数,第一个位置参数是函数,第二个位置参数是可迭代对象
res = filter(lambda n : n >3, [1,2,3,4,5,6,7,8,9])
print(list(res))
过滤出列表中大于3的数
第一个参数函数依次取第二个参数的列表中的元素,进行判断,如果为true则保留,如果为false则去除
2、abs 获取绝对值
3、exec 执行python代码
4、all内置函数
判断所有的值都不为空,迭代对象内所有的元素都为真,返回True
传入的是可迭代对象
5、any内置函数
迭代对象内只要有一个元素为真,返回True
传入可迭代对象
6、map内置函数
将函数应用于iterable中每一项并输出其结果的迭代器
7、zip内置函数
聚合打包:以最短的列表为准
8、其他内置函数
四、纯函数和函数副作用
1、纯函数不是一种函数,是一种概念
2、纯函数的好处
减轻代码的耦合度
3、纯函数的概念
简单来说,一个函数的返回值结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数
4、纯函数的3个原则
1)变量都只在函数作用域内获取,作为的函数参数传入
2)不会产生副作用(side effects),不会改变被传入的数据或者其他数据(全局变量)
3)相同的输入保证相同的输出
示例:
func是纯函数,func2不是纯函数,相同的输入不能保证相同的输出,变量不仅仅是自己的参数还有全局变量c
func3不是纯函数,它对外部环境有副作用,改变了列表的值
5、函数的副作用
副作用是指函数被调用,完成了函数既定的计算任务,但同时因为访问了外部数据,尤其是因为对外部数据进行了写操作,从而一定程度地改变了系统环境
五、闭包与装饰器
1、闭包
1)函数内部可定义函数
外层函数可以通过return返回内层函数
2)什么是闭包?
1、外层函数中嵌套一个内层函数
2、外层函数的返回值,是内层嵌套的函数名
3、内层函数对外部有非全局变量的引用
2、装饰器