【一】函数对象
-
函数对象指的是函数可以被当做数据来处理
【1】函数可以被引用
# 定义一个函数 def add(x, y): return x + y # 将函数地址赋给一个变量 func = add # 通过这个变量找到对应的地址,从而调用函数 res = func(1, 2) print(res) # 3
【2】函数可以作为容器类型的元素被存储
def add(x, y): return x + y def max(a, b): return a * b dic = {'add': add, 'max': max} print(dic) # {'add': <function add at 0x0000021DDCD53E20>, 'max': <function max at 0x0000021DDCE7B640>} res = dic['add'](1, 3) max_ = dic['max'](2, 3) print(res) # 4 print(max_) # 6
【3】函数可以作为参数传入另一个参数中
def add(x, y): return x + y def foo(x, y, func): return func(x, y) res = foo(2, 3, add) print(res) # 5
【4】函数的返回值可以是一个函数
def add(x, y): return x + y def bar(): return add func = bar() print(func) # <function add at 0x0000020B27393E20> res = func(2, 4) print(res) # 6
【二】闭包函数
【1】什么是闭包
-
闭包是指包含对自由变量的函数和对这些变量的引用环境的组合
-
基于函数对象的概念,可以将函数返回到任意位置去调用
-
但是作用域的关系是在定义玩函数时就已经被确定了的,与函数调用位置无关
# 定义全局变量 x_ = 1 # 定义外层函数 def outer(): def inner(): print(x_) return inner def func(): func_x = 4 # 调用f1()返回函数f2 inner = outer() # 需要按照函数定义时的作用关系去执行,与调用位置无关 inner() func()
【2】什么是闭包函数
-
也就是说函数被当做数据处理时,始终以自带的作用域为准
-
若内嵌函数包含对外部函数作用域(而非全局作用域)
-
那么该‘内嵌函数’就是闭包函数,简称闭包(Closures)
# 定义全局变量 x_ = 1 # 定义外层函数 def outer(): # 定义局部变量,覆盖全局变量 x_ = 2 def inner(): # 打印外部函数的局部变量 print(x_) return inner func = outer() func() # 2