闭包,简单版装饰器。

函数名:函数名可以理解为一个特殊的变量。
直接打印函数名,得到的是函数的内存地址。

def f1():
    print(1211)
print(f1)

函数名可以定义为一个函数的参数。

a = 1
def f1(x):
    print(x)
f1(a)

def f1():
print(555)
def f2(x):
x()
f2(f1)
 


函数名可以作为容器类型的元素。

def f1():
    print(1211)
def f2():
    print(1222)
def f3():
    print(1233)
def f4():
    print(1233)
li = [f1,f2,f3,f4,]
for i in li:
    i()


函数能作为字典的值。


函数名还可以作为函数的返回值

def f11(x):
    return x
a = f11(5)
print(a)



def f1():
print(666)
def f2(x):
return x
a = f2(f1)
a()


def wraaper():
def inner():
print(666)
return inner

ret = wraaper()
ret()

什么是闭包?

闭包,就是内层函数对外层函数(非全局)变量的引用。

内存函数对外层函数非全局变量的引用就叫闭包。

判断是不是闭包 用内层函数名.__closure__ 返回None

当执行一个函数时候,如果解释器判断此函数内部内部闭包存在,这样
python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。(用于爬虫)

def wraaper1():
    name = '老男孩'
    def inner():
        print(name)
    inner()
    print(wraaper1().__closure__)
wraaper1()

输出结果:

老男孩
(<cell at 0x00000050ABD24D38: str object at 0x00000050ABDC6BC0>,)

name = '老男孩'
def wraaper2():
name1 = 'alex'
def inner():
print(name)
print(name1)
inner()
print(inner.__closure__)
wraaper2()
 



猜你喜欢

转载自www.cnblogs.com/ZJGG/p/9025421.html