可爱的 Python: 迭代器和简单生成器
2008-11-13 13:17:36 来源:WEB开发网这个函数是十分友好的存储器。它只需要记住一个以前的值,返回一个单个数字(不是一个数字的大列表)。并且与此类似的一个函数可以返回取决于(部分地或完全地)外部事件的连续的值。不利的一面是,利用这个函数有点不够简练,且相当不灵活。
静态随机遍历的迭代
num = randomwalk_static()
while num is not None:
print num,
num = randomwalk_static()
新的遍历方法
实质上,Python 2.2 序列都是迭代器。Python 常见的习惯用法 for elem in lst: 现在实际上让 lst 产生一个迭代器。然后, for 循环反复调用这个迭代器的 .next() 方法,直到它遇到 StopIteration 异常为止。幸运的是,由于所有常见的内置类型自动产生它们的迭代器,所以 Python 程序员不需要知道这里发生了什么。实际上,现在字典里有 .iterkeys() 、 .iteritems() 和 .itervalues() 方法来产生迭代器;首要的是在新的习惯用法 for key in dct: 中使用了什么。同样,通过调用 .readline() 迭代器支持新的习惯用法 for line in file: 。
但是如果实际所产生的是在 Python 解释器内,则显而易见要用定制类来产生它们自己的迭代器,而不是专使用内置类型的迭代器。定制类支持直接使用 randomwalk_list() 以及一次一个元素这种“极度节省”的 randomwalk_static ,它是简单易懂的:
RandomWalk_Iter.py
import
random
class
randomwalk_iter
:
def
__init__
(self):
self.last = 1
# init the prior value
self.rand = random.random()
# init a candidate value
def
__iter__
(self):
return
self
# simplest iterator creation
def
next
(self):
if
self.rand < 0.1:
# threshhold terminator
raise
StopIteration
# end of iteration
else
:
# look for usable candidate
while
abs(self.last-self.rand) < 0.4:
print
'*',
# display the rejection
self.rand = random.random()
# new candidate
self.last = self.rand
# update prior value
return
self.rand
更多精彩
赞助商链接