- 容器是一系列元素的集合,str、list、set、dict、file、sockets对象都可以看作是容器,容器都可以被迭代(用在for,while等语句中),因此他们被称为可迭代对象。
- 可迭代对象实现了
__iter__
方法,该方法返回一个迭代器对象。
- 迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了
__next__
和__iter__
方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。
- 生成器是一种特殊的迭代器,它的返回值不是通过
return
而是用yield
。
- 按照鸭子模型理论,生成器就是一种迭代器,可以使用for进行迭代。
- 第一次执行next(generator)时,会执行完yield语句后程序进行挂起,所有的参数和状态会进行保存。
再一次执行next(generator)时,会从挂起的状态开始往后执行。
在遇到程序的结尾或者遇到StopIteration时,循环结束。
- 可以通过generator.send(arg)来传入参数,这是协程模型。
- 可以通过generator.throw(exception)来传入一个异常。throw语句会消耗掉一个yield。
可以通过generator.close()来手动关闭生成器。
- 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]
[]
#