迭代器与生成器

迭代器

迭代器是访问集合元素的一种方式。迭代器从集合的第一个元素开始访问,直到所有的元素被访问完结束。

迭代器的特点:

1.访问者不需要关心迭代器内部结构,只需要通过__next__方法去取下一个内容

2.不能直接访问集合中间的某个值,只能从头访问到尾

3.访问到一半时不能回退

4.适合访问比较大的数据结合,节省内存

li = iter(['aa','bb','cc'])  #生成一个迭代器

print(type(li))  
#<class 'list_iterator'>
print(li.__next__())  #获取下一个值
#aa
print(li.__next__())
#bb
print(li.__next__())
#cc

生成器

一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器。

yield:使函数中断,并保存中断状态,中断后可以继续执行其他代码,可以重新执行这个函数,从上一次yield语法下一句开始执行

ef money(qian):
    while qian >0:
        qian -= 100
        yield 100
        print('又来取钱了,败家子!!!')

atm = money(500)
print(atm.__next__())
print(atm.__next__())
print('来个大保健')
print(atm.__next__())
print(atm.__next__())
print(atm.__next__())
#输出结果
100
又来取钱了,败家子!!!
100
来个大保健
又来取钱了,败家子!!!
100
又来取钱了,败家子!!!
100
又来取钱了,败家子!!!
100

yield异步

在单线程的情况下实现并发运算

 1 import time
 2 def consumer(name):
 3     print('%s 准备吃包子了'%name)
 4     while True:
 5         baozi = yield  #接收值i
 6         print('包子[%s]来了,被[%s]吃了' %(baozi,name))
 7 
 8 def shengchan(name):
 9     c = consumer("A")
10     c2 = consumer("B")
11     c.__next__()
12     c2.__next__()
13     print('%s开始做包子了'%name)
14     for i in range(10):
15         time.sleep(1) #过了一秒钟
16         print('%s做了两个包子'%name)
17         c.send(i)
18         c2.send(i)
19 
20 shengchan('yoyo')

 

posted @ 2016-07-06 11:35  yoyoua  阅读(197)  评论(0编辑  收藏  举报