闭包、装饰器、生成器、迭代器
闭包
- 两个函数的嵌套
- 内层函数返回外层函数引用
- 一般外层函数都会有
参数
外层函数的参数会在内存中保留
(变量指向)
def 外层函数(外层参数):
def 内层函数(内层参数):
pring(内层参数)
return 内层函数引用
内层函数引用 = 外层函数(外层参数)
内层函数引用(内层参数)
装饰器
def fun():
def inner():
print("额外的功能")
return inner
@fun
def game():
print("这是函数原有的功能")
- 示例:这里的
@set_fun
是一个语法糖
,先执行==> test = set_fun(test)
def set_fun(func):
def call_fun():
print("用户认证")
func()
return call_fun
@set_fun # ==> test = set_func(test)
def test():
print("转账")
@set_fun # ==> test2 = set_func(test2)
def test2():
print("收钱")
迭代器
可迭代对象
- 遍历可迭代对象的时候其实获取的是可迭代对象的迭代器
- 然后通过迭代器获取对象中的数据
原理
- iter函数: 获取可迭代对象的迭代器,会调用可迭代对象身上的
__iter__
方法
- next函数: 获取迭代器中下一个值,会调用迭代器对象身上的
__next__
方法
for循环的本质
生成器
- 一类特殊的迭代器
- 不需要再像上面的类一样写
__iter__()
和__next__()
方法了,依然可以使用next函数和for循环取值
yield
- 使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)
- 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
- 每次启动生成器都会返回一个值,多次启动可以返回多个值,也就是yield可以返回多个值
评论区