函数名可以作为一个变量,函数的参数,函数的返回值,容器类类型的元素
1 作为一个变量
例1:
def func1():
print(666)
f1 = func1 # 这里函数名实际上是个变量,只是变量名改了而已
f2 = f1
>>>
f2()
666
2 作为函数的参数
例2:
def func2(x):
print(x)
print('===', x())
print(func2(func1)) # 把func1的地址作为func2的参数,再执行func2函数。
>>>
<function func1 at 0x000001898B86FE18>
666
=== None
None
3 函数名作为返回值
def wraaper():
def inner():
print('inner ')
return inner
ret = wraaper()
ret()
>>>
inner
'''
此时执行了inner()函数,为什么执行外部函数可以执行内嵌的函数呢,因为return了函数名,实际上形成了闭包。
4 闭包
当return一个嵌入的函数名时,在全局命名空间就可以直接找到该函数的地址,也就是可以执行函数,原理是在全局变量空间外层的函数的内存地址指向了嵌入的函数的内存地址。通常要执行内层的函数时必须执行外层的函数才可以执行内嵌的函数,当外层函数return了内嵌的函数名,实际上把内嵌的函数地址放在外面了,就是告诉所有外部人,这就是我的地址,通过这个地址你们就可以找到我。