#迭代器 #可直接作用于for循环的数据类型 #一类是集合数据类型,list,tuple,dict,set,str #一类是generator,包括生成器和带yield的generator function #这些可以直接作用于for循环的对象统称为可迭代对象:Iterable #可以使用isinstance()判断一个对象是否是Iterable对象 from collections import Iterable print (isinstance("abc",Iterable)) #生成器不仅可以作用for循环,还可以被next()函数不断调用并返回 #一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值 #可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator #可以使用isinstance()判断一个对象是否是Iterator对象 from collections import Iterator print (isinstance((x for x in range(10)),Iterator)) #生成器都是Iterator对象,但list、dict、str等虽然是可迭代的,但 #不是一个迭代器 #把可迭代对象变成迭代器可以使用iter()函数 from collections import Iterable,Iterator print (isinstance([],Iterable)) print (isinstance([],Iterator)) print (isinstance(iter([]),Iterable)) #为什么list、dict等数据类型不是一个迭代器 #因为Python的迭代器对象表示的是一个数据流,迭代器对象可以被 #next()函数调用并不断返回下一个数据,直到没有数据抛出 #StopIteration错误,可以把这个数据流看成是一个有序序列,但 #我们却不能提前知道序列长度,只能不断通过next()函数实现按需 #计算下一个数据,所以迭代器计算是惰性的,只有在需要返回下一个 #数据时它才会计算 #迭代器甚至可以表示一个无限大的数据流 #总结 #凡是可作用与for循环的对象都是可迭代对象 #凡是可作用于next()函数的对象都是迭代器类型,表示一个惰性计算的序列 #集合数据类型是可迭代对象,但不是迭代器,可通过iter()函数 #获得一个迭代器对象 #Python的for循环本质上是通过不断调用next()函数实现的 for i in range(): print (i)
import time def consumer(name): print ("%s 准备吃包子啦!" % name) while True: baozi = yield print ("包子[%s]来了,被[%s]吃了" % (baozi,name)) def producer(): c1 = consumer("Jack") c2 = consumer("Tom") c1.__next__() c2.__next__() for i in range(1,11): time.sleep(1) print ("做好1个包子,分成两份!") c1.send(i) c2.send(i) producer()
时间: 2024-10-14 20:45:12