新的遍历方法

实质上,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 ,它是简单易懂的:

  1. RandomWalk_Iter.py  
  2. import  
  3. random  
  4. class  
  5. randomwalk_iter  
  6. :  
  7. def  
  8. __init__  
  9. (self):  
  10. self.last = 1   
  11. # init the prior value  
  12. self.rand = random.random()   
  13. # init a candidate value  
  14. def  
  15. __iter__  
  16. (self):  
  17. return  
  18. self     
  19. # simplest iterator creation  
  20. def  
  21. next  
  22. (self):  
  23. if  
  24. self.rand < 0.1:   
  25. # threshhold terminator  
  26. raise  
  27. StopIteration   
  28. # end of iteration  
  29. else  
  30. :   
  31. # look for usable candidate  
  32. while  
  33. abs(self.last-self.rand) < 0.4: 
  34. print  
  35. '*',  
  36. # display the rejection  
  37. self.rand = random.random()   
  38. # new candidate  
  39. selfself.last = self.rand     
  40. # update prior value  
  41. return  
  42. self.rand 

这个定制迭代器看起来确实如同由函数生成的真实列表一样:

  1. 随机遍历类的迭代  
  2. for num in randomwalk_iter():  
  3. print num, 

事实上,即使支持习惯用法 if elem in iterator ,它仅尝试为确定真值所需要的那么多的迭代器的元素,如果最终的值为 false,当然,它就需要测试所有元素)。


评论关闭