zoukankan      html  css  js  c++  java
  • python3----生成器generator(yield)

    # 列表推导式
    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.发送一个信息到生成器内部
  • 相关阅读:
    Java Servlet(十):JSTL核心标签库
    Java Servlet(九):转发请求与重定向请求区别
    Java tomcat启动失败(Servlet3.0 Web Project):A child container failed during start
    快速安装服务
    Java Servlet(八):EL自定义函数
    Java Servlet(七):JavaWeb MVC 操作(jdk7+tomcat7+eclipse)
    新版mysql(mysql-5.7.12-winx64)安装
    oracle之 oradebug 命令用法
    Linux 绑定双网卡
    Linux 之 NTP 服务 服务器
  • 原文地址:https://www.cnblogs.com/jonm/p/8288627.html
Copyright © 2011-2022 走看看