迭代器为类序列对象提供了一个类序列接口。
迭代器就是有一个 next( ) 方法的对象,而不是通过索引来计数(注意和列表进行区别),当循环机制需要下一项时,调用迭代器的 next( ) 方法就能获取他,当元素被全部取出后,会引发一个 StopIteration 异常, 代表迭代完成, 这种迭代和列表中元素的“迭代”很类似, 只是实现的方式不同。 在迭代中,可以直接通过 for 循环来自动调用迭代器的 next( ) 方法。
生成器机制:协同程序的概念, 协同程序是可以运行的独立函数调用, 可以暂停和挂起,并从程序离开的地方继续或者重新开始,在调用程序和被调用的协同程序之间也有通信。比如, 当协同程序暂停的时候,我们能从其中获得一个中间的返回值,当调用回到协同程序中时, 能够传入额外或者改变了的参数,但任能够从我们上次离开的地方开始(实例见下边例2),并且所有状态完整。挂起返回出中间值并多次从挂起的地方继续执行的协同程序被称为生成器。在生成器中挂起程序并立即返回结果是通过yield指令来实现的。
生成器的概念从语法上讲是一个带有yield语句的函数,也就是说,这个函数能够通过yield语句的功能实现返回一个中间的结果给调用者并且暂停执行,当生成器的next()方法被调用时, 它能够准确地从离开的地方继续执行。
下边关于生成器的一个小例子:
例1:
def firstGen():
yield 1
yield 2
for item in firstGen():
print item
在这个小例子中应该注意的地方是,for循环可以自动调用next()方法并且对 StopIteration做了处理。
例2:
def counter(num):
start_num = num
while True:
value = (yield start_num)
if value is not None:
start_num = value
else:
start_num -= 1
count = counter(10)
print count.next()
print count.next()
count.send(3)
print count.next()
print count.next()
运行结果: 10, 9, 2, 1