具体文章:ALEX的文章 https://www.cnblogs.com/alex3714/articles/5765046.html
串行的并行效果:
4 import time 5 6 def consumer(name): 7 print("%s 准备吃包子啦!" %name) 8 while True: 9 baozi = yield 10 11 print("[%s]包子来了,被[%s]吃了!" %(baozi,name)) 12 13 14 15 # c = consumer("小胡胡") #已经变成生成器,接下来每一步都要用next 16 # c.__next__() 17 # a1= "鸡肉馅" 18 # c.send(a1) 19 # c.__next__() 20 21 22 def producer(name): 23 c = consumer('A') #已经变成迭代器,接下来都要用next 24 c2 = consumer('B') 25 c.__next__() 26 c2.__next__() 27 print("老子开始准备做包子啦!") 28 for i in range(15): 29 a = ['茴香鸡蛋','茴香肉','韭菜鸡蛋','韭菜肉','白菜粉条鸡蛋','白菜肉','猪肉大葱',\ 30 '牛肉大葱','羊肉胡萝卜','猪肉芹菜','猪肉菠菜','鸡蛋菠菜韭菜','纯肉馅','香菇肉','酸菜馅'] 31 time.sleep(1) 32 print("[%s]做了1个\033[31;1m[%s]包子\033[0m,分两半一人一半!"%(name,a[i])) 33 c.send(a[i]) 34 c2.send(a[i]) 35 36 producer("Tiger")
运行结果:
1 A 准备吃包子啦! 2 B 准备吃包子啦! 3 老子开始准备做包子啦! 4 [Tiger]做了1个[茴香鸡蛋]包子,分两半一人一半! 5 [茴香鸡蛋]包子来了,被[A]吃了! 6 [茴香鸡蛋]包子来了,被[B]吃了! 7 [Tiger]做了1个[茴香肉]包子,分两半一人一半! 8 [茴香肉]包子来了,被[A]吃了! 9 [茴香肉]包子来了,被[B]吃了! 10 [Tiger]做了1个[韭菜鸡蛋]包子,分两半一人一半! 11 [韭菜鸡蛋]包子来了,被[A]吃了! 12 [韭菜鸡蛋]包子来了,被[B]吃了! 13 [Tiger]做了1个[韭菜肉]包子,分两半一人一半! 14 [韭菜肉]包子来了,被[A]吃了! 15 [韭菜肉]包子来了,被[B]吃了! 16 [Tiger]做了1个[白菜粉条鸡蛋]包子,分两半一人一半! 17 [白菜粉条鸡蛋]包子来了,被[A]吃了! 18 [白菜粉条鸡蛋]包子来了,被[B]吃了! 19 [Tiger]做了1个[白菜肉]包子,分两半一人一半! 20 [白菜肉]包子来了,被[A]吃了! 21 [白菜肉]包子来了,被[B]吃了! 22 [Tiger]做了1个[猪肉大葱]包子,分两半一人一半! 23 [猪肉大葱]包子来了,被[A]吃了! 24 [猪肉大葱]包子来了,被[B]吃了! 25 [Tiger]做了1个[牛肉大葱]包子,分两半一人一半! 26 [牛肉大葱]包子来了,被[A]吃了! 27 [牛肉大葱]包子来了,被[B]吃了! 28 [Tiger]做了1个[羊肉胡萝卜]包子,分两半一人一半! 29 [羊肉胡萝卜]包子来了,被[A]吃了! 30 [羊肉胡萝卜]包子来了,被[B]吃了! 31 [Tiger]做了1个[猪肉芹菜]包子,分两半一人一半! 32 [猪肉芹菜]包子来了,被[A]吃了! 33 [猪肉芹菜]包子来了,被[B]吃了! 34 [Tiger]做了1个[猪肉菠菜]包子,分两半一人一半! 35 [猪肉菠菜]包子来了,被[A]吃了! 36 [猪肉菠菜]包子来了,被[B]吃了! 37 [Tiger]做了1个[鸡蛋菠菜韭菜]包子,分两半一人一半! 38 [鸡蛋菠菜韭菜]包子来了,被[A]吃了! 39 [鸡蛋菠菜韭菜]包子来了,被[B]吃了! 40 [Tiger]做了1个[纯肉馅]包子,分两半一人一半! 41 [纯肉馅]包子来了,被[A]吃了! 42 [纯肉馅]包子来了,被[B]吃了! 43 [Tiger]做了1个[香菇肉]包子,分两半一人一半! 44 [香菇肉]包子来了,被[A]吃了! 45 [香菇肉]包子来了,被[B]吃了! 46 [Tiger]做了1个[酸菜馅]包子,分两半一人一半! 47 [酸菜馅]包子来了,被[A]吃了! 48 [酸菜馅]包子来了,被[B]吃了!View Code
迭代器
可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list列表
、tuple元组
、dict字典
、set集合
、str字符串
等;
一类是generator(生成器)
,包括生成器和带yield
的generator function。
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
而生成器不但可以作用于for
循环,还可以被next()
函数不断调用并返回下一个值,直到最后抛出StopIteration
错误表示无法继续返回下一个值了。
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
生成器都是Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
把list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
函数:
1 >>> isinstance(iter([]), Iterator) 2 True 3 >>> isinstance(iter('abc'), Iterator) 4 True
小结
- 凡是可作用于
for
循环的对象都是迭代对象
类型; - 凡是可作用于
next()
函数的对象都是迭代器
类型,它们表示一个惰性计算的序列,不运行就不执行; - 集合数据类型如
list
、dict
、str
等是迭代对象但不是迭代器,不过可以通过iter()
函数获得一个迭代器对象。