生成器
生成器
1、什么是生成器
生成器是一个自定义的迭代器,本质上是一个迭代器,内置有.__ iter__ () 和. __ next__()
2、如何实现生成器
- 在函数内部定义yield
- 调用函数时,函数体代码不会执行
- 会返回一个值,这个返回值就是生成器
3、yield
- 每次yield都会往生成器对象中添加一个值
- yield只能在函数内部定义
- yield让函数执行暂停,下次调用从上次暂停位置继续执行,直到重新遇到yield再次被暂停
4、yield与return的区别
相同点:返回值的个数都是无限制的
不同点:return只能返回一次,函数便终止执行后续代码,yield可以多次使用,让函数执行暂停,下次调用从上次暂停位置继续执行,直到重新遇到yield再次被暂停
def func():
print("函数体代码")
yield
yield 2
yield 3, 4, '5', '6' # yield返回多个值也是默认返回成元组,可修改成其他的类型返回出去
yield ['7', 8, 9]
# 正常执行不会执行函数体代码
# res是一个迭代器,如果不赋值给res会重复执行第一个yield
res = func()
# 当我们通过__next__取值时,才会执行函数体代码。
# res.__next__() # 执行函数体代码,得到返回值none但没打印返回值,所以没有
print(res.__next__())
# yield可以保存函数的暂停状态,下次在上次基础上执行直到遇到下次yield
print(res.__next__())
print(res.__next__())
# print(res.__next__()) # StopIteration报错
>>>
函数体代码
None
2
(3, 4, '5', '6')
# next(迭代器对象)相当于迭代器对象.__next__()
next(res) # 执行函数体代码,得到返回值none但没打印返回值,所以没有
print(next(res))
print(next(res))
print(next(res))
>>>
函数体代码
2
(3, 4, '5', '6')
['7', 8, 9]
# 如果不报错想自动执行
while True:
try:
print(next(res))
except StopIteration:
break
自定义range,实现range功能
def my_range(start,end,move=1):
while start < end:
yield start
start += move
for i in my_range(1,5):
print(i)
>>>
1
2
3
4
for i in my_range(1,6,2):
print(i)
>>>
1
3
5