Iterator
迭代器是实现了迭代方式的容器,python的迭代器需要实现 next()方法和__iter__()方法,next()方法返回容器的下一个项目,
__iter__()方法返回迭代器本身。
python有一个built-in函数 iter()用来从序列对象,如String, list中生成迭代器。
当序列达到末尾时,将会抛出StopIteration异常。for...in...循环会捕获这个异常从而得知循环结束。
View Code
Generator
生成器使用yield关键字,使函数在执行中中断并返回中间的结果。
1 def fibonacci():
2 a, b = 0, 1
3 while True:
4 yield b
5 a, b = b, a+b
generator对象是特殊的一种iterator,它会在执行过程中保存执行的上下文环境,并在下次执行中从yield语句后继续计算。
generator不需要抛出StopIteration异常,函数并没有将序列项一次生成,所以generator在实现上可以有无穷个元素,而不需要无穷的存储空间。
Generator 和 Coroutine
generator有三个方法可以用来实现协程,send()、throw()、close()
generator函数使用send(),能够传入参数
throw()抛出异常
close()退出generator
multitask模块使用generator来实现coroutine
1 import multitask
2 import time
3 def coroutine_1():
4 for i in range(3):
5 print 'c1'
6 yield i
7
8 def coroutine_2():
9 for i in range(3):
10 print 'c2'
11 yield i
12
13 multitask.add(coroutine_1())
14 multitask.add(coroutine_2())
15
16 multitask.run()
c1
c2
c1
c2
c1
c2
List Comprehension and Generator Expressions
有两种相似的写法:
1 a = [x**2 for x in range(10) if x % 2 == 0]
2 b = (x**2 for x in range(10) if x % 2 == 0)
如果使用type显示对象类型的,a为list,b为generator,b的这种写法是简化的generator,而a仅仅是一个列表对象。