函数对象与闭包

函数名的多种用法

用法一:函数名当做变量名赋值

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()包起来传参呢?别急,这是为接下来的内容做铺垫用的。

image

posted @ 2022-06-06 19:14  Yume_Minami  阅读(55)  评论(0编辑  收藏  举报