Python高级之函数对象与闭包函数

【一】函数对象

  • 函数对象是指函数可以被当成数据来处理,python中一切皆为对象

【1】函数可以被引用

def add(a, b):
    return a + b


res = add(3, 4)
print(res)  # 7

【2】函数作为容器类型的元素

def add(a, b):
    return a + b


num_list = [add, 1]
res = num_list[0](3, 4)
print(res)  # 7

【3】函数作为参数传入另一个参数

def add(a, b):
    return a + b


def multi(a, b, function):
    return function(a, b)


res = multi(3, 4, add)
print(res)  # 7

【4】函数的返回值可以是一个函数

def add(a, b):
    return a + b


def multi():
    return add


func = multi()
res = func(3, 4)
print(res)  # 7

【二】闭包函数

【1】什么是闭包

  • 闭包是指包含对自由变量的函数和对这些变量的引用环境的组合
a = 1 # 全局变量


def outside():
    def inside():
        print(a)

    return inside


def func():
    inside = outside() # 将函数Iinside的内存地址赋给变量inside
    inside() # 再调用inside


func()  # 1

【2】什么是闭包函数

  • 闭包函数就是对外部作用域有引用的函数
  • 内嵌函数对外部函数作用域有引用,那这个内嵌函数就叫闭包函数
a = 1  # 全局变量


def outside():
    a = 2  # 局部变量

    def inside():
        print(a)

    return inside


res = outside()  # 拿到函数inside的内存地址
# 需要再次调用它
res()  # 2

【3】如何查看闭包函数所包裹的外部变量

  • 使用函数的closure属性,查看到闭包函数所包裹的外部变量
a = 1  # 全局变量


def outside():
    a = 2  # 局部变量

    def inside():
        print(a)

    return inside


res = outside()  # 拿到函数inside的内存地址
# 需要再次调用它
res()  # 2

res_first = res.__closure__
print(res_first)  # (<cell at 0x000001945A08B9A0: int object at 0x0000019459AA0110>,)

print(dir(res.__closure__[0]))
'''
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'cell_contents']
'''

# __closure__ 属性是一个元组,包含了函数闭包中的每个 cell 对象。每个 cell 对象都有一个 cell_contents 属性,它存储着相应的值。
res_second = res.__closure__[0].cell_contents
print(res_second)  # 2
posted @ 2024-05-09 15:08  Ligo6  阅读(19)  评论(0)    收藏  举报