迭代器(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油条
这里输出的感觉就是在串行程序中实现了异步效果