yield是一个简单好用但又费解的语句。认真地琢磨了两天,觉得自己弄明白了。就结合着例子用自己的理解来说说吧。
1.yield相当于“return”+位置信息。yield这个词本身用的就很巧妙。因为这个词“生产”和“停止”两个意思都有。yield既表示产生返回值,又表示在这个地方停下来,等待下一次循环。就是从yield返回之后开始迭代。关于这一点,必须搞清楚。第一相当于return,第二下次执行该函数时不是从头再来,而是从停下的地方开始。
def iter1():
print("begining iter1...")
yield 1000
print("go on! iter1.")
s1=iter1()
print(next(s1))
输出为:
这里要注意两点。一是包含yield的函数就成了特殊的生成器函数。调用这个生成器函数时,函数并不执行,只是构成生成器。
二是要用next()获得yield返回值。每一个next()只返回一个返回值。如果没有yield了,则报错。
例如,如果为上例再增加一行代码:
print(next(s1))
系统则会报错。因为iter1()函数里,yield只有一次机会,没有第二个循环。事实上没有形成迭代。当然,这里的yield意义不大。
2.利用for...in迭代。利用yield形成迭代的方法。yield可以记录位置,但本身不形成迭代。需要通过for...in语句或者while语句,或者列表来完成跌到。
def iter2():
print("begining iter2...")
for i in range(5):
yield i*2
print("go on! iter2")
s2=iter2()
for i in range(5):
print(next(s2))
3.利用while迭代。
def iter3(count):
print("begining iter3:")
while count<10:
yield i*2
print("go on! iter3")
s3=iter3(5)
for i in range(5):
print(next(s3))
4.利用列表迭代
def addlist(alist):
for i in alist:
yield i+1
alist=[1,2,3,4,5]
for x in addlist(alist):
print(x)