经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python【day 12】生成器和推导式
来源:cnblogs  作者:cn5036518  时间:2019/10/8 9:31:10  对本文有异议
  1. 一、生成器和生成器函数
    1、生成器和生成器函数的概念

    1、生成器的本质是迭代器
    2、函数中包含yield,就是生成器函数

    2、生成器函数的写法
    def func():
    a =10
    yield 20
    gen = func() #没有执行,而是生成一个生成器
    普通函数和生成器函数的不同
    1、普通函数名()表示函数的的执行
    2、生成器函数名()不是函数的执行,而是生成一个生成器

    yieldreturn的不同
    1retun表示返回,同时函数执行终止,return之后的代码不会执行
    2yield也表示返回,函数暂停,函数分段执行

    def func():
    a =10
    yield 20
    b = 30
    yield 40
    gen = func() #生成一个生成器
    gen.__next__() #返回20 执行到第一个yield
    gen.__next__() #返回40 从第一个yeild开始执行到第二个yield

    3、如何得到生成器
    1、生成器函数
    生成器函数名()
    2、生成器表达式
    3、类型转换

    4、生成器的特点
    1、节省内存
    2、惰性机制(每执行一次__next__()方法,取值一次)
    3、只能向前取值,不能退后

    5、生成器的取值
    __next__()方法和send()方法的区别
    前者表示向下取值
    后者除了表示向下取值,还可以给上一个yield传递值
    注意:send()方法不能用在第一个取值,第一个取值只能用__next__()
    最后一个yield也不能用send()

    6、生成器的好处
    节约内存
    '''

    #关于__next__()方法和send()方法的例子
    def func():
    a = 1
    a2 = yield 2
    print(a2)
    c = 3
    c2 = yield 4
    print(c2)
    yield 5
    gen = func() #生成一个生成器
    gen.__next__() #执行到了第一个yield
    gen.send('test') #把参数传递到第一个yield
    gen.send('娃哈哈') #把参数传递到第2个yield

    #生成器的好处-节约内存的例子
    #一次性买100件衣服,需要地方保存,比较浪费内存
    li1 = []
    def func2():
    for i in range(1,11):
    li1.append('衣服 %s' % i)
    return li1
    ret = func2()
    print(ret) #100件衣服一次性生成出来,放到列表到了
    print('----------1')

    #最好的方式是下一个100件衣服的订单,但是呢,需要一件,送一件,就不需要专门的地方保存了,节约内存
    #方法1 生成器函数
    def func3():
    for i in range(1,11):
    yield ('衣服 %s' %i)
    gen = func3() #生成一个生成器
    print(gen.__next__()) #第一件
    print(gen.__next__()) #第二件
    for i in gen: #生成器本质是迭代器,支持for循环
    print(i)

    #方法2 生成器表达式
    # gen = (i for i in range(1,11))
    # print(gen) #生成一个生成器(类比:就是买衣服订单)
    # print(gen.__next__()) #第一件
    # print(gen.__next__()) #第二件
    # for i in gen: #生成器本质是迭代器,支持for循环
    # print(i)

    二、推导式
  1. 推导式(列表推导式,字典推导式等)
    1、列表推导式:[结果 for循环 if条件]
    2、字典推导式:{key: value for循环 if条件}
    3、集合推导式:{key for循环 if条件}
    注意:没有元组推导式

    三、生成器表达式
  1. 1、生成器表达式:(结果 for循环 if条件)
    2、惰性机制(类比:弹夹没子弹了,不能将同一个值,生成2次)
    生成器是记录在内存中的一段代码,产生的时候,没有执行

    生成器表达式和列表推导式的区别类比:
    1、买100个鸡蛋,列表推导式:是一次性把100个鸡蛋买回来,需要地方存储
    2 生成器表达式:是买一只母鸡,需要鸡蛋就给下蛋

原文链接:http://www.cnblogs.com/wangtp/p/11630913.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号