具体文章: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]吃了!
可以直接作用于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()
函数获得一个迭代器对象。
原文:https://www.cnblogs.com/handsometiger28/p/12333391.html