奇妙的流控制 Python中的迭代器与生成器(1)(2)
新的遍历方法
实质上,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:
- '*',
- # display the rejection
- self.rand = random.random()
- # new candidate
- selfself.last = self.rand
- # update prior value
- return
- self.rand
这个定制迭代器看起来确实如同由函数生成的真实列表一样:
- 随机遍历类的迭代
- for num in randomwalk_iter():
- print num,
事实上,即使支持习惯用法 if elem in iterator ,它仅尝试为确定真值所需要的那么多的迭代器的元素,如果最终的值为 false,当然,它就需要测试所有元素)。
评论关闭