zoukankan      html  css  js  c++  java
  • Python生成器

      生成器(Generator)是Python中的一类特殊对象,如果一个函数中出现一次或多次yield表达式,那么这个函数就是一个生成器。

      生成器的特点是:

    • 调用生成器时,函数体并没有执行
    • 调用生成器时,返回的是一个特殊的迭代器对象,这个迭代器对象封装了生成器的函数体、本地变量和当前执行点;
    • 当生成的迭代器的next()方法被调用时,被封装的函数体执行到下一个yield的位置,
    • 执行 yield 语句时,返回 yield 后面的表达式作为next()方法的返回值,然后把执行状态保存起来。下一次再执行 next() 方法时,函数体继续执行到下一个yield语句
    • 函数体执行结束或遇到 return 语句,则生成器抛出异常StopIteration,然后迭代过程结束
    • 生成器中的 return 语句不能带有表达式

    生成器对比返回列表的函数:

    • 每次执行才返回需要的结果,比一次将所有结果放在列表中返回更节省空间
    • 如果需要同时传入所有的元素,则需要使用列表

    例1. 一个生成器的例子

    def updown(n):
        for x in xrange(1, n): yield x
        for x in xrange(n, 0, -1): yield x
    for i in updown(5):
        print i ,
    1 2 3 4 5 4 3 2 1
    

      

    生成器表达式

      生成器表达式(generator expression)和列表推导式(list comprehension)具有非常类似的结构,列表推导式是使用方括号[]表示生成一个列表,而生成器表达式则是使用圆括号()返回一个一次产生一个值的生成器:

    例:生成器表达式与列表推导式

    >>> l = range(1,10)
    >>> l
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> [x*x for x in l] #列表推导式
    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> (x*x for x in l) # 生成器表达式
    <generator object <genexpr> at 0x000000000224E288>
    

      显然,生成器表达式兼具列表推导式的简洁的优点,还能节省内存。

  • 相关阅读:
    iOS开发-UIColor和UIImage之间的转换
    iOS开发-给用户好的印象
    iOS开发之国际化(本地化)
    git学习之创建分支和合并分支
    iOS设置StatusBar字体颜色问题
    iOS开发技巧,细节(二)
    iOS开发,[NSBundle mainBundle] pathForResource方法返回空的问题解决
    【MM MRP】PA-SCM525 Unit2 Lot-Size$Rounding Profile(MRP_2)
    【MM MRP】PA-I (MRP_1)
    【MM 发票】MM MIRO界面中的ITEM LIST的布局可自己定义(转)
  • 原文地址:https://www.cnblogs.com/Security-Darren/p/4713615.html
Copyright © 2011-2022 走看看