您的位置:首页 > 编程语言 > Python开发

python3----生成器generator(yield)

2018-01-15 16:25 471 查看
# 列表推导式
a = [i for i in range(100) if not(i % 2) and (i % 3)]
print(a)
# 字典推导式
b = {i: i % 2 == 0 for i in range(10)}
print(b)
# 集合推导式
c = {i for i in [1, 3, 2, 6, 5, 1, 2, 3, 6, 5, 9, 5]}
print(c)
# 生成器推导式
d = (i for i in range(10))
print(d)

e = sum(i for i in range(100) if i % 2)

实例:
1 import random
2
3 def get_data():
4     # 返回0到9之间的3个随机数
5     return random.sample(range(10), 3)
6
7
8
9 def consume():
10     # 显示每次传入的整数列表的动态平增增均值
11     running_sum = 0
12     data_items_seen = 0
13
14     while True:
15         data = yield
16         data_items_seen += len(data)
17         running_sum += sum(data)
18         print('The running average is {}'.format(running_sum / float(data_items_seen)))
19
20
21 def produce(consumer):
22     # 产生序列集合,传递给消费函数(consumer)
23     while True:
24         data = get_data()
25         print('Produced {}'.format(data))
26         consumer.send(data)
27         yield
28
29 if __name__ == '__main__':
30     consumer = consume()
31     consumer.send(None)
32     producer = produce(consumer)
33
34     for _ in range(10):
35         print('Producing...')
36         next(producer)
  • generator是用来产生一系列值的
  • yield则像是generator函数的返回结果
  • yield唯一所做的另一件事就是保存一个generator函数的状态
  • generator就是一个特殊类型的迭代器(iterator)
  • 和迭代器相似,我们可以通过使用next()来从generator中获取下一个值
  • 通过隐式地调用next()来忽略一些值
# 生成器的创建方式
# 1,列表生成式
# 2,函数
#
#
# yield vs return
# return 返回并中止函数
# yield 返回数据, if 关冻结当前执行过程..:
# next唤醒冻结的函数执行过程,继续执行,直到遇到下一个yield
#
# 函数有了yield之后
# 1.函数名加()就得到了一个生成器
# 2.return 在生成器里,代表生成器的中止,直接报错
#
# next
#
# 唤醒生成器的继续执行
#
# send("stop")
# 1.唤醒并继续执行
# 2.发送一个信息到生成器内部
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: