对象与闭包函数
一、函数对象
- 函数对象指的是函数可以被当做 数据 来处理,具体可以分为四个方面的使用函数
[1]函数可以被引用
- 函数的调用方式中使用表到时,将地址给到其他变量名就是引用
def add(x, y):
return x + y
add_1 = add
z = add_1(1, 2) # 将函数地址给z变量名
print(z)
[2]函数可以作为容器类型的元素
def add(x, y):
return x + y
def subtract(x, y):
return x - y
#可以做为字典里的值
dict_fun = {1: add, 2: subtract}
func_id = int(input("请输入ID:")) # 请输入ID:1
func = dict_fun[func_id]
print(func(5, 4)) # 9
[3]函数可以作为参数传入传入另一个函数
def add(x, y):
return x + y
def subtract(x, y):
return x - y
# add作为subtract函数的一个参数
print(subtract(add(4, 5), 5)) # 4
[4]函数的返回值可以是一个函数
def outer():
print("这是外层函数!", end=' ')
def inner():
print("这是内层函数!")
return inner
# 用变量接收返回的函数
func = outer()
func() # 这是外层函数! 这是内层函数!
二、闭包函数
[1]什么是闭包
- 闭包是指包含对自由变量的函数和对这些变量的引用环境的组合。
- 基于函数对象的概念,可以将函数返回到任意位置去调用
- 但作用域的关系是在定义完函数时就已经被确定了的,与函数的调用位置无关。
[2]什么是闭包函数
- 一个引用了外层函数作用域里的变量的内嵌函数
a = 1
def outer():
a = 2
def inner():
print(a)
return inner
#inner()函数引用了外部函数outer()作用域里的变量,使用inner()函数就是一个闭包函数
func = outer()
func() # 2
[3]闭包函数的用途
(1)保持状态
- 保持状态: 闭包可以用来保持函数调用之间的状态。
(2)函数工厂
- 函数工厂: 闭包允许创建函数工厂,即可以动态生成函数。
- 在你的例子中,
page
函数就是一个函数工厂,它返回一个根据传入的url
动态生成的函数
(3)封装
- 封装: 闭包可以用来实现类似面向对象编程中的封装概念。
- 通过将函数和其相关的状态(变量)捆绑在一起,形成一个封闭的单元。