函数对象与闭包
函数名的多种用法
用法一:函数名当做变量名赋值
def index():
print('来自函数index')
res = index # 让res也指向index指向的函数体代码
res() # 相当于执行了index()
# 输出:来自函数index
用法二:函数名当函数的实参
def index():
print('来自函数index')
def func(a):
a()
func(index) # 实参index传给形参a,func函数内部的a()变成了index()
# 输出:来自函数index
用法三:函数名当做函数的返回值
def func():
return index # 将函数名当做返回值
def index():
print('来自函数index')
res = func() # res接收函数名index
res() # 相当于执行了index()
# 输出:来自函数index
用法4:函数名作为容器类型的元素
def index():
print('来自函数index')
l1 = [1, 2, 3, index]
l1[-1]() # 相当于执行了index()
# 输出:来自函数index
闭包函数
闭包概念
- 闭:定义在函数内部的函数
- 包:内部函数使用了外层函数名称空间中的名字
# 闭包函数
def outer():
x = 111
# 定义在函数内部的函数
def inner():
# 使用了外层函数名称空间中的名字
print(x)
return inner
x = 666
res = outer()
res() # 输出:111
实际应用
闭包函数是给函数体传参的另外一种方式
def outer(username):
def index():
print(username)
return index
res = outer('kevin') # 形参username与值kevin临时绑定
res() # 输出:kevin
res1 = outer('jason') # 形参username与值jason临时绑定
res1() # 输出:jason
这时候有人就很迷惑了,明明只要定义一个函数index()就可以了,为什么要用outer()包起来传参呢?别急,这是为接下来的内容做铺垫用的。