迭代器(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油條
這裏輸出的感覺就是在串行程序中實現了異步效果