列表生成器
# 列表生成式 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) # <generator object <genexpr> at 0x0000000004200CF0> """生成器: 只用调用是才会生成相应的数据 只记录当前位置 只有一个__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 个包子 """