Python编程:generator生成器

举报
彭世瑜 发表于 2021/08/14 01:38:12 2021/08/14
【摘要】 列表生成器 # 列表生成式 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, 1...

列表生成器

# 列表生成式
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__()
"""
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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 : 异常消息
"""
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

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 个包子
"""
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/78947964

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。