一:函数名解析闭包
首先,咱们定义一个函数,分别打印他们函数和变量名app
def func(): print(111) print(func()) print(func) print(())
打印结果:函数
解读:首先打印111,是由于执行了func()这个函数。测试
其次打印的是空,none,是由于函数没有返回值。spa
在次打印得是函数名内存地址,由于定义函数自己就是一个变量。内存
最后打印()是由于里面没有东西,放什么打印什么for循环
2 函数名能够赋值。变量
def func(): print(111) def func1(): print(222) def func2(): print(333) f=func x=func1 y=func2 f() x() y() l1=[f(),x(),y()] for i in l1: print(i)
打印结果:循环
解读:引用
第一次先打印111,222,333是由于函数调用结果
第二次打印此结果是由于for循环打开这个函数,上面分别调用而成。
第三次打印是none是由于函数没有返回值,打印这个函数,就是none。
函数名练习2
def func2(): print(111) def func3(x): print(222) x() func3(func2)
执行结果:222,111
解读:func3(fuc2)将func2传值给x,打印222,x()执行上面func2函数,打印111
练习3
def func2(): print(222) def func3(x): print(a) # func2() return a a = 3 ret = func3(a) print(ret)
打印结果:3,3
解析:没通过func2函数,因此不执行222
def func2(): print(222) def func3(x): # print(x) # func2() return x f = func2 f() ret = func3(func2) # x func2 ret() func3(func2)()
打印结果:222,222,222
第一个打印222,f()调用执行了一次。
第二次打印 return x给了fun3(fun2) 而x=func2 ret接收这个x ret()就是print222
第三次func3(func2)() 就至关于x() 也就是又打印了一遍222
二:闭包函数
内部函数引用外部函数(非全局变量)的变量
def func(): x=1 def func1(): print(x) func1() print( func1.__closure__) func()
测试是否是闭包函数的方法
函数名.__closure__,而后打印出来包含cell就是闭包
以下图就不是一个闭包,由于是全局变量,打印结果是1,NONE,none就说明不是一个闭包。
闭包陷阱
# 在外层函数的内部,执行inner() # return inner def wrapper(): def inner(): print(666) return inner # wrapper() # inner wrapper()()
执行过程是什么?
首先在内存开辟一个临时空间将wrapper函数存储里面,而后wrapper()开始执行函数,返回inner,给最后,此时inner=wrapper(),后面加上(),开始执行inner里面函数,打印666,此时结束。
为何不是闭包,由于没有传值,返回值显示none,内部不没有调用外部的值,谈什么闭包。
def wrapper(): def i(): def inner(): print(666) print(inner.__closure__) return inner return i # wrapper() # inner wrapper()()