python中yield的工作原理及迭代方法例解

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章