|
|
|
|
移动端

3.2.1 迭代器(2)

《自学Python:编程基础、科学计算及数据分析》第3章Python 进阶,在本章中,我们将学习 Python的一些进阶用法,包括函数的进阶,迭代器、生成器、装饰器、上下文管理器的使用,以及 Python中的变量作用域。本节为大家介绍迭代器。

作者:李金来源:机械工业出版社|2018-05-04 13:33

技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战

3.2.1 迭代器(2)

可以用列表初始化这个迭代器,并将这个迭代器与 for循环一起使用:

  1. In [14]: for i in Reverse(range(10)):    ...: print i,    ...:  
  2. 9 8 7 6 5 4 3 2 1 0 

这里用到了 print的一个技巧:print默认会在输入的内容后自动加上回车,可以在输出内容后加上一个逗号“,”,让它不输出回车。

构造迭代器不一定需要容器对象。

例如,对一个正整数n,有如下迭代规则:

如果n是奇数,令n=3n+1;

如果n是偶数,令n=n/2;Collatz猜想为:从任意的正整数 n开始使用上述规则迭代,总能在有限次操作内使 n为1。

我们利用此规则定义一个迭代器 Collatz,该迭代器初始化接受一个正整数n,保存在.value属性中,作为序列的开始:

  1. class Collatz(object):  
  2. def __init__(self, n):  
  3. self.value = n 

其.next()方法按照规则迭代.value属性,直到它等于1:

  1. def next(self):  
  2. if self.value == 1:  
  3. raise StopIteration  
  4. elif self.value % 2 == 0:  
  5. selfself.value = self.value / 2  
  6. else:  
  7. self.value = 3 * self.value + 1  
  8. return self.value 

完整的定义为:

  1. In [15]: class Collatz(object):  
  2. ...: def __init__(self, n):  
  3. ...: self.value = start 
  4. ...:  
  5. ...: def __iter__(self):  
  6. ...: return self  
  7. ...:  
  8. ...: def next(self):  
  9. ...: if self.value == 1:  
  10. ...: raise StopIteration  
  11. ...: elif self.value % 2 == 0:  
  12. ...: selfself.value = self.value / 2  
  13. ...: else:  
  14. ...: self.value = 3 * self.value + 1  
  15. ...: return self.value  
  16. ...: 

用 for循环迭代生成的迭代器:

  1. In [16]: for i in Collatz(7):  
  2. ...: print i,  
  3. ...:  
  4. 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 

在这个过程中,我们并没有构造完整的容器存储这个序列,而是在调用迭代器.next()方法的过程中,不断计算得到下一个值。

对于列表、元组、字典等容器类型来说,为了方便多次循环,每次调用.__iter__()方法时会返回一个新的迭代器:

  1. In [17]: x = [1, 2, 3]  
  2. In [18]: x.__iter__()  
  3. Out[18]: <listiterator at 0x4951048> 
  4. In [19]: x.__iter__()  
  5. Out[19]: <listiterator at 0x4951550> 

而对于文件对象来说,通常我们只会迭代文件对象一次,因此它的.__iter__()方法每次会返回同一个迭代器。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

PHP和MySQL Web开发(原书第3版)

本书将介绍如何创建可交互的Web站点,包括从最简单的订单表单到复杂的安全电子商务站点。而且,读者还将了解如何使用开放源代码技术来实现...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊