高阶函数

一、递归函数

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、装饰器

 

posted @ 2021-10-21 21:34  %女王%  阅读(443)  评论(0编辑  收藏  举报