生成器(generator)

  • 容器是一系列元素的集合,str、list、set、dict、file、sockets对象都可以看作是容器,容器都可以被迭代(用在for,while等语句中),因此他们被称为可迭代对象。
  • 可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。
  • 迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了__next____iter__方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。
  • 生成器是一种特殊的迭代器,它的返回值不是通过return而是用yield
  1. 按照鸭子模型理论,生成器就是一种迭代器,可以使用for进行迭代。
  2. 第一次执行next(generator)时,会执行完yield语句后程序进行挂起,所有的参数和状态会进行保存。
    再一次执行next(generator)时,会从挂起的状态开始往后执行。
    在遇到程序的结尾或者遇到StopIteration时,循环结束。
  3. 可以通过generator.send(arg)来传入参数,这是协程模型。
  4. 可以通过generator.throw(exception)来传入一个异常。throw语句会消耗掉一个yield。
    可以通过generator.close()来手动关闭生成器。
  5. next()等价于send(None)
if __name__ == '__main__':
    '''
    数组生成表达式
    '''
    loops = [randrange(2,5) for x in xrange(randrange(3,7))]
    print iter(loops)
    for i in iter(loops):
        print type(i)
    print loops
    print '#'
    '''
    生成器表达式
    '''
    loops = (randrange(2,5) for x in xrange(randrange(3,7)))
    print type(loops)
    for i in loops:
        print i
    print list(loops)
    print '#'
    loops = (randrange(2,5) for x in range(randrange(3,7)))
    print list(loops)
    print list(loops)
    print '#'
<listiterator object at 0x0000000002756B00>
<type 'int'>
<type 'int'>
<type 'int'>
[3, 2, 4]
#
<type 'generator'>
3
3
4
[]
#
[4, 4, 2]
[]
#




猜你喜欢

转载自blog.csdn.net/Walker_Xie/article/details/80789871