匿名函数、闭包

匿名函数

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

posted @ 2020-07-16 22:50  he。  阅读(69)  评论(0编辑  收藏  举报