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油条

这里输出的感觉就是在串行程序中实现了异步效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值