1.例如:
def order():
lst = []
for i in range(18):
lst.append(f"yifu{i}")
if len(lst) == 3:
yield lst
print("2222222 times")
lst = []
gen = order() #这里执行函数后,得到的是一个生成器
print(gen.__next__()) #通过__next__()方法,返回数据,
print(gen.__next__()) #第二次执行代码就从printprint("2222222 times")这里开始。继续循环,可以通过debug来看执行过程
def odd():
print('step 1')
yield 1
print('step 2')
yield 2
print('step 3')
yield 3
"""
o = odd()
print(o.__next__())
print(o.__next__())
print(o.__next__())
print(o.__next__())
# Traceback (most recent call last):
File "/root/PycharmProjects/untitled1/gen.py", line 28, in <module>
print(o.__next__())
StopIteration
"""
分析过程:
可以看到,odd不是普通函数,而是generator,在执行过程中,遇到yield就中断,下次又继续执行。执行3次yield后,已经没有yield可以执行了,所以,第4次调用next()就报错,因此这里如果要优化,就需要再调用生成器的时候判断
o = odd()
for i in range(4):
try:
o.__next__()
except StopIteration:
print("over")
2: 生成式表达式
g = (x * 2 for x in range(6))
print(g) #<generator object <genexpr> at 0x7fe5b9c80ba0>
print(g.__next__()) #调用__next__方法才会有返回数据
print(g.__next__())
print(g.__next__())
执行结果:
0
2
4