1.9 生成一个迭代器和生成器
上一节,我们了解了什么是迭代器,这一节我们来讨论如何生成一个迭代器。
1.9.1 准备工作
生成器提供了清晰的语法,能够依次访问一个序列,并不需要使用__iter__和next()这两个函数。我们也不用写一个类了。请注意,生成器和可迭代这两者才能制造一个迭代器。
1.9.2 操作方法
如果你理解了前面小节里的推导,我们下面的示例你也能明白,在这个示例中,我们有一个生成器推导。回忆一下,我们曾经用下面的方式来进行一个元组推导,并得到了一个生成器对象。
SimpleCounter = (x**2 for x in range(1,10))
tot = 0
for val in SimpleCounter:
tot+=val
print tot
1.9.3 工作原理
很明显,上面的代码片段将算出给定范围的数的平方和,本例中的范围是从1到9(Python的range函数是右侧结束),使用生成器,我们创建了一个名为SimpleCounter的迭代器,我们用它在for循环中循序访问那些潜在的数据。请注意我们现在没有使用iter()函数,代码十分清晰,我们成功地用一种优雅的方式重建了我们的旧SimpleCounter类。
1.9.4 更多内容
让我们看看如何使用yield语句来创建一个生成器。
def my_gen(low,high):
for x in range(low,high):
yield x**2
tot = 0
for val in my_gen(1,10):
tot+=val
print tot
在上面的代码中,my_gen()函数就是一个生成器,我们使用yield语句来返回一个序列输出。
在前面的小节中,我们提到过生成器和可迭代两者才能制造一个迭代器,下面我们通过使用iter函数调用生成器来验证一下。
gen = (x**2 for x in range(1,10))
for val in iter(gen):
print val
在我们进入下一节“使用可迭代对象”之前,强调一下使用生成器的注意事项,当我们完成对序列的访问时,就该立刻结束,不要再试图获取更多的数据。
使用生成器对象时,我们只能访问序列一次。
时间: 2025-01-21 13:07:01