迭代器
迭代器是访问集合元素的一种方式。迭代器从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器的特点:
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')