zoukankan      html  css  js  c++  java
  • Python语法

    生成器基本概念

    1 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束

    2 生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存,所以生成器可以用在需要节省内存的场景

    3 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器函数

    next( generator object) 可以用于获取生成器返回的值

     例子

    def test():

          i = 0

          while True:

                yield i

                i += 1

    I = test() 

    print (next(I))
    print (next(I))

    也可以用下面方式迭代,效果一样

    print( I.next() )
    print( I.next() )

    注意: 直接 

    print( next(test()) )
    print ( next(test()) )

    是错误的,因为是俩个实例,所以输出都会是0

    yield 与 return

    在一个生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration;
    如果遇到return,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。

    如果在return后返回一个值,那么这个值为StopIteration异常的说明,不是程序的返回值

    def test():

          i = 0

          while True:

                yield i

                i += 1

                if i > 5:

                      break

    print( I.next() )
    print( I.next() )
    print( I.next() )
    print( I.next() )
    print( I.next() )
    print( I.next() )
    print( I.next() )

    输出

    0
    1
    2
    3
    4
    5

    Traceback (most recent call last):
    File "C:string.bak.py", line 31, in <module>
    print( I.next() )
    StopIteration

    生成器支持的方法

    >>> help(odd_num)

    Help on generator object:
     
    odd = class generator(object)
    |  Methods defined here:
    ......
    |  close(...)
    |      close() -> raise GeneratorExit inside generator.
    |
    |  send(...)
    |      send(arg) -> send 'arg' into generator,
    |      return next yielded value or raise StopIteration.
    |
    |  throw(...)
    |      throw(typ[,val[,tb]]) -> raise exception in generator,
    |      return next yielded value or raise StopIteration.
    ......
     
    close方法
    手动关闭生成器函数,后面的调用会直接返回StopIteration异常
     
    next方法

    对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。

    然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数,

    后面再次调用next,依次类推

     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Hostker云主机
    Orz 终于有了自己的博客地址
    BZOJ 1635: [Usaco2007 Jan]Tallest Cow 最高的牛
    BZOJ 1636: [Usaco2007 Jan]Balanced Lineup
    BZOJ 2252: [2010Beijing wc]矩阵距离
    BZOJ 2253: [2010 Beijing wc]纸箱堆叠
    BZOJ 无数据题集合
    BZOJ 1087: [SCOI2005]互不侵犯King
    BZOJ 3236: [Ahoi2013]作业
    POJ2352:Stars
  • 原文地址:https://www.cnblogs.com/sysnap/p/6589966.html
Copyright © 2011-2022 走看看