匿名函数、闭包
匿名函数
lambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方
优点:让代码更加精简,不需要考虑命名的问题
#常规函数 def fun(x,y): return x + y #匿名函数 a = lambda x,y:x + y print(fun(2,3))
上面是我们对calc这个匿名函数的分析,下面给出了一个关于匿名函数格式的说明
函数名 = lambda 参数 :返回值 #参数可以有多个,用逗号隔开 #匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值 #返回值和正常的函数一样可以是任意数据类型
写匿名函数:接收一个可切片的数据,返回索引为0与2的对应的元素(元组形式)。
funk = lambda x:(x[0],x[2]) print(funk('asdafdaf'))
写匿名函数:接收两个int参数,将较大的数据返回。
funk = lambda x, y: x if x > y else y print(funk(5, 6))
总结:
1、匿名函数不是没有名字,他是有名字的,他的名字就是你给其设置的变量,比如func。
2、lambda 是定义匿名函数的关键字,相当于函数的def。
3、lambda 后面直接加形参,形参加多少都可以,只要用逗号隔开就行。
func = lambda a,b,*args,sex= 'alex',c,**kwargs: kwargs print(func(3, 4,c=666,name='alex')) # {'name': 'alex'} # 所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到。
4、返回值在冒号之后设置,返回值和正常的函数一样,可以是任意数据类型。
5、匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据。
闭包
闭包的定义
1. 闭包是嵌套在函数中的函数。
2. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用。
判断闭包的方法
def make_averager(): series = [] def averager(new_value): series.append(new_value) total = sum(series) return total/len(series) return averager avg = make_averager() # 函数名.__code__.co_freevars 查看函数的自由变量,存在自由变量为闭包 print(avg.__code__.co_freevars) # ('series',) # ==============当然还有一些参数,仅供了解============== # 函数名.__code__.co_freevars 查看函数的自由变量 print(avg.__code__.co_freevars) # ('series',) # 函数名.__code__.co_varnames 查看函数的局部变量 print(avg.__code__.co_varnames) # ('new_value', 'total') # 函数名.__closure__ 获取具体的自由变量对象,也就是cell对象。 # (<cell at 0x0000020070CB7618: int object at 0x000000005CA08090>,) # cell_contents 自由变量具体的值 print(avg.__closure__[0].cell_contents) # []
闭包的作用
保存局部信息不被销毁,保证数据的安全性。
闭包的应用
1、可以保存一些非全局变量但是不易被销毁、改变的数据。
2、装饰器。