-
- 列表生成器,生成器,生成器的方法
- 列表生成器演示
- 列表生成器,生成器,生成器的方法
[i*2 for i in range(10)] #列表生成器
(i*2 for i in range(10)) # 生成器
__next__() #生成器的唯一方法?
>>> a=(i*2 for i in range(10))
>>> print(a)
<generator object <genexpr> at 0x0000000001 #生成器的计算公式?
>>> a=(i*2 for i in range(10))
>>> for i in a:
... print(i)
...
0
2
4
6
8
10
12
14
16
18
>>> a=(i*2 for i in range(10))
>>> print(a)
<generator object <genexpr> at 0x0000000000
>>> a.__next__()
0
>>> a.__next__()
2
>>> a.__next__()
4
>>> a.__next__()
6
>>> a.__next__()
8
>>> a.__next__()
10
等等
-
-
- 函数生成器演示
-
优点
- 可以自由进进出出,不必等待函数运行完毕
- 抓异常
3,return '---done---' 当异常时打印的值
def fib(max): #10
n, a, b = 0, 0, 1
while n < max: #n<10
#print(b)
yield b
a, b = b, a + b
#a = b a =1, b=2, a=b , a=2,
# b = a +b b = 2+2 = 4
n = n + 1
return '---done---' #当异常时打印
#f= fib(10) #第一次演示已经注释掉啦 演示 进进出出
g = fib(6) #第二次演示 演示 抓异常处理
while True:
try:
x = next(g)
print('g:', x)
except StopIteration as e:
print('Generator return value:', e.value)
break
#print("---------dddd")
# print(f.__next__())
# print("======")
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
print("====start loop======")
#for i in f:
# print(i)
-
- 生成器并行
生成两个消费者
初始化--其实就是运行到yield停止,而且c.__next__()是继续运行函数,当运行到yield时又重新停止
c.__next__() 运行yield
c.sent(b1) 传递值给yield并运行
总之yield就是暂停 当然不仅可以暂停可以传递值
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
c = consumer("ChenRonghua")
c.__next__()
# b1= "韭菜馅"
# c.send(b1)
# c.__next__()
def producer(name):
c = consumer('A') #生成两个消费者
c2 = consumer('B')
c.__next__() #初始化准备吃包子
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了1个包子,分两半!")
c.send(i)
c2.send(i)
producer("alex")