一:函数名解析
首先,我们定义一个函数,分别打印他们函数和变量名
def func(): print(111) print(func()) print(func) print(())
打印结果:
解读:首先打印111,是因为执行了func()这个函数。
其次打印的是空,none,是因为函数没有返回值。
在次打印得是函数名内存地址,因为定义函数本身就是一个变量。
最后打印()是因为里面没有东西,放什么打印什么
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()()