列表生成器
# 列表生成式
lst = []
for i in range(10):
lst.append(i * 2)
print(lst)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 相当于:
lst = [i * 2 for i in range(10)]
print(lst)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 列表生成器:循环迭代,推断下一元素
lst = (i * 2 for i in range(10))
print(lst)
#
"""生成器:
只用调用是才会生成相应的数据
只记录当前位置
只有一个__next__()
"""
yield生成器
# 菲波那切数列Fibonacci
def fib(max): # 此时不能叫函数,应该叫生成器
n = 0
a, b = 0, 1
while n < max:
yield b # 返回当前值,并保存当前状态
a, b = b, a+b # 同时赋值
n = n+ 1
return "异常消息" # 输出异常信息
f = fib(10)
print("===")
print(f.__next__()) # 下一个值
print("===")
print(f.__next__())
print("==start loop==")
# for i in f:
# print(i)
while True:
try:
g = next(f)
print(g)
except StopIteration as e:
print("value of e :", e.value)
break
"""OUT:
===
1
===
1
==start loop==
2
3
5
8
13
21
34
55
value of e : 异常消息
"""
yield生成器-协程
import time
def consumer(name): # 消费者
print("%s 来吃包子了!" % name)
while True:
baozi = yield
print("%s 吃了第 %s 个包子" % (name, baozi))
def producer(): # 生产者
a = consumer("A") #初始化一个生成器
b = consumer("B")
a.__next__() #程序走到第一个yield
b.__next__()
print("我要开始做包子了")
for i in range(10):
time.sleep(1)
print("第 %s 个包子" % i)
a.send(i) # 将数据发送到 yield 位置,并执行一次next
b.send(i)
producer()
# consumer("a")
"""
A 来吃包子了!
B 来吃包子了!
我要开始做包子了
第 0 个包子
A 吃了第 0 个包子
B 吃了第 0 个包子
第 1 个包子
A 吃了第 1 个包子
B 吃了第 1 个包子
第 2 个包子
A 吃了第 2 个包子
B 吃了第 2 个包子
第 3 个包子
A 吃了第 3 个包子
B 吃了第 3 个包子
第 4 个包子
A 吃了第 4 个包子
B 吃了第 4 个包子
第 5 个包子
A 吃了第 5 个包子
B 吃了第 5 个包子
第 6 个包子
A 吃了第 6 个包子
B 吃了第 6 个包子
第 7 个包子
A 吃了第 7 个包子
B 吃了第 7 个包子
第 8 个包子
A 吃了第 8 个包子
B 吃了第 8 个包子
第 9 个包子
A 吃了第 9 个包子
B 吃了第 9 个包子
"""