Python:迭代器與生成器

迭代器(iterator)

:訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問, 直到所有元素被訪問完結束。迭代器只能前進不能後退,但實際應用時很少在迭代中後退。迭代器的一大優點是不需要 事先準備好整個迭代過程中的所有元素,僅在迭代到某個元素時 才計算該元素,在這之前或之後,元素可以不存在或被銷燬 。適合與遍歷一些巨大或包含yield的函數,這些都是一個可迭代對象。利用next方法,取每一次的yield。利用send方法向yield發送數據

>>> x=iter([1,2,3,4,5])
>>> type(x)
<type 'listiterator'>
>>> x.next()
1
>>> [i for i in x]
[2, 3, 4, 5]
>>>

生成器(generator)

一個函數調用時返回一個迭代器,那麼這個函數就叫做生成器。如果函數中包含yield語法,則這個函數就會變成生成器。

實例:

>>> def test(num):
...     print("Start")
...     while num>0:
...         num-=50
...         yield "Output:%d"%num
...         print("next round")
...
>>>
>>> t=test(300)
>>> t
<generator object test at 0x00000000029031B0>
>>> t.next()
Start
'Output:250'  #執行到yield結束

>>> t.next()  #開始進入循環
next round
'Output:200'  #同樣執行到yield結束
>>> t.next()
next round
'Output:150'
>>> t.next()
next round
'Output:100'
>>> t.next()
next round
'Output:50'
>>> t.next()
next round
'Output:0'
>>> t.next()
next round
#由於退出了循環,yield執行完了,產生了一個異常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

其他

send()方法,向協成發送數據。典型的生產者-消費者問題。

"""
生產者消費者問題
炸油條,變炸邊喫,炸的是生產者,喫的是消費者
"""

import time

def consumer(name):
    print("Start wait:")
    #開始喫
    while True:
        food=yield  #從生產者那接受油條
        print("%s開始喫第%d油條"%(name,food))


def producer():
    #這裏出現了兩個顧客
    c1=consumer('cmustard')
    c2=consumer('mumu')
    #顧客等着喫油條,等着send
    c1.next()
    c2.next()
    #生產者給顧客做了10根油條
    for i in range(1,11):
        #把油條給消費者
        print("{:*^60}").format("finish food")
        c1.send(i)
        c2.send(i)
        #發送後在做新的油條
        time.sleep(2)

producer()

輸出結果

Start wait:
************************finish food*************************
cmustard開始喫第1油條
mumu開始喫第1油條
************************finish food*************************
cmustard開始喫第2油條
mumu開始喫第2油條
************************finish food*************************
cmustard開始喫第3油條
mumu開始喫第3油條
************************finish food*************************
cmustard開始喫第4油條
mumu開始喫第4油條
************************finish food*************************
cmustard開始喫第5油條
mumu開始喫第5油條
************************finish food*************************
cmustard開始喫第6油條
mumu開始喫第6油條
************************finish food*************************
cmustard開始喫第7油條
mumu開始喫第7油條
************************finish food*************************
cmustard開始喫第8油條
mumu開始喫第8油條
************************finish food*************************
cmustard開始喫第9油條
mumu開始喫第9油條
************************finish food*************************
cmustard開始喫第10油條
mumu開始喫第10油條

這裏輸出的感覺就是在串行程序中實現了異步效果

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