day13生成器
补充:
无参装饰器模板
def wrapper(func):
def inner(*args, **kwargs):
# 在装饰对象前添加功能
res = func(*args, **kwargs)
# 在装饰对象后添加功能
return res
return inner
有参装饰器模板
def outer(arg):
def wrapper(func):
def inner(*args, **kwargs):
res = func(*arg, **kwargs)
return res
return inner
return wrapper
生成器:
-
什么是生成器
-
生成的工具
生成器是一个“自定义”的迭代器,本质上是一个迭代器,
-
-
如何实现生成器
- 但凡在函数内部定义了的yield。
- 调用函数时,函数体代码不会执行
- 会返回一个结果,该结果就是一个生成器
-
yield
-
每一次yield都会往生成器对象中添加一个值。
—yield只能在函数内部定义
—yield可以保存函数的暂停状态
# 自定义迭代器 def func(): print('from func') yield #yield可以保持函数的\n # 暂停状态,不会被执行 自定义的迭代器 def func(): print('开始准备下蛋') print('1---火鸡蛋1') yield '火鸡蛋1' print('2---火鸡蛋2') yield '火鸡蛋2' print('3---火鸡蛋3') # 可以通过yield依次执行函数体代码 yield '火鸡蛋3'
-
-
yield和return:
-
相同点:
返回的值都是无限制的。
-
不同点:
return只能返回一次值,yield可以返回多个值。
-
迭代器
l1 = [1, 2, 3, 4, 5]
iter_l1 = (l1.__iter__())
print(iter_l1) # 得到的是迭代器对象的地址
print(iter_l1.__next__())
# 当我们通过__next__取值时,才会执行函数体代码。
print(iter_l1.__next__())
# 自定义range功能,创建一个自定义的生成器
def my_range(start,end, move =1 ): #开始,结束,步长
while start < end:
yield start
start += move
g_range = my_range(1, 5)
print(g_range)
for line in g_range:
print(line)