原文

  • iterator protocol
  • iterable
  • iterator iter next
  • for loop的实现原理
  • 构建自己的Iterator
  • Infinite Iterators

iterator protocol

iterator object必须实现两个method:
__iter()____next()__

注意: Python 3 中使用__iter__()__next__();Python 2 中使用__iter__()next()

iterable

iterable是个名词
list, tuple, dict都是iterable
可以用for x in yyy形式的yyy都是一个iterable

iterator、 iter()、 next()

如果一个对象yyy是iterable,那么可以用a = iter(yyy)获得一个iterator a

也可以用yyy.__iter__()

再用next(a)手动进行一次迭代/iterate

也可以用a.__next__()

当一个iterator已经迭代到头了,下一次next()会报StopIteration错误
下面是一个例子

# define a list
my_list = [4, 7, 0, 3]# get an iterator using iter()
my_iter = iter(my_list)## iterate through it using next() #prints 4
print(next(my_iter))#prints 7
print(next(my_iter))## next(obj) is same as obj.__next__()#prints 0
print(my_iter.__next__())#prints 3
print(my_iter.__next__())## This will raise error, no items left
next(my_iter)

for loop的实现原理

for element in iterable:# do something with element

对应的实现代码是:

# create an iterator object from that iterable
iter_obj = iter(iterable)# infinite loop
while True:try:# get the next itemelement = next(iter_obj)# do something with elementexcept StopIteration:# if StopIteration is raised, break from loopbreak

构建自己的Iterator

对于一个类,只要实现__iter__()__next__()方法即成为一个iterator
__iter__() method返回iterator对象本身,同时也可以做一些初始化工作
__next__() method返回一系列迭代值,最后通过raise StopIteration错误来结束迭代
下面的例子每次迭代返回一个2幂次方,幂指数从0一直到用户给定的值

class PowTwo:"""Class to implement an iteratorof powers of two"""def __init__(self, max = 0):self.max = maxdef __iter__(self):self.n = 0return selfdef __next__(self):if self.n <= self.max:result = 2 ** self.nself.n += 1return resultelse:raise StopIteration

那么运行结果为:

>>> for i in PowTwo(5):
...     print(i)
...
1
2
4
8
16
32

Infinite Iterators

迭代器可以是无限迭代的,例如依次返回所有的奇数。
不过使用时必须谨慎处理,加上适当的终止条件。
Python built-in 函数iter()可以有两个参数
一参是一个callable object (如function)
二参是一个sentinel value (终止条件/ terminating condition)。
迭代器会调用这个function直到返回值等于sentinel value。
例如,

>>> int()
0>>> inf = iter(int,1)
>>> next(inf)
0
>>> next(inf)
0

iter(int, 1)返回了一个迭代器,这个迭代器遇到1时终止迭代。

注意:遇到1直接raise StopIteration,而不是下次迭代raise StopIteration

int()(int的构造函数)永远都返回0
因此这个迭永远不会停止,即成为一个infinite iterator.

深入浅出 Python Iterators 迭代器相关推荐

  1. Python的迭代器和生成器

    Python的迭代器和生成器 一.迭代器Iterators 迭代器仅是一容器对象,它实现了迭代器协议.它有两个基本方法: 1)next方法 返回容器的下一个元素 2)__iter__方法 返回迭代器自 ...

  2. python有关迭代器和生成器的面试题_【面试题 | Python中迭代器和生成器的区别?】- 环球网校...

    [摘要]今天给大家解答一道Python常见的面试题,希望这个面试栏目,给那些准备面试的同学,提供一点点帮助!小编会从最基础的面试题开始,每天一题.如果参考答案不够好,或者有错误的话,麻烦大家可以在留言 ...

  3. 做一个python的旅游系统_有了它,妈妈再也不担心我感冒了,Python使用迭代器进行天气预报...

    上一篇博文我们使用Python制作了一个简单的天气预报小程序(天气渐冷,Python小工具让你随时掌握气温变化,做温暖的穿衣达人).今天,需求有变,如果我们想去旅游,备选方案有北京.上海.广州.新疆等 ...

  4. python中迭代器的实现原理_Python 进阶应用教程

    Python 中的迭代器实现原理 在数学中,集合表示由一个或多个确定的元素所构成的整体.在 Python 中,列表.元组.集合可以用于表示数学中的集合. 例如,分别使用列表.元组.集合表示了一个包含 ...

  5. C++ Iterators(迭代器)

    Iterators迭代器 C++ Iterators(迭代器) 迭代器的描述 对vector容器对象生成和使用了迭代器 C++ Iterators(迭代器) 迭代器可被用来访问一个容器类的所包函的全部 ...

  6. Python之迭代器

    迭代器( iterator) --是访问集合元素的一种方式,迭代器从集合的第一个元素开始访问,直到所有元素被访问结束.并且,迭代器只能向前访问. 优点:不要求事先准备好整个迭代过程中的所有元素,迭代器 ...

  7. python迭代器好处_关于Python中迭代器的作用

    迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...

  8. 回归素材(part10)--深入浅出python机器学习

    学习笔记,仅供参考,有错必纠 文章目录 深入浅出python机器学习 线性回归 基本原理 使用 L 2 L_2 L<

  9. python中迭代器有哪些_Python迭代器:什么是Python中的迭代器以及如何使用它?

    Python编程语言已经扩展了创新的每一个方面,包括机器学习.数据科学.人工智能等,这些概念是Python作为编程语言取得成功的基石.在本文中,我们将通过以下概念来理解Pytho Python编程语言 ...

  10. python getattr_深入浅出Python模块

    引言 上周发表了<老胡讲Python>系列第一篇,得到了很多的关注.在第一篇中,大家表示对模块不是很明白,而模块的概念在Python中是十分重要的,于是今天带来<老胡讲Python& ...

最新文章

  1. 泛型委托Action与ActionT
  2. 【Linux驱动】linux内核模块简介
  3. webpack 4.0 配置文件 webpack.config.js文件的放置位置
  4. 使用C#操作XML文件
  5. c语言json映射,GitHub - xujun621/cson: 基于C语言的json数据映射解析库
  6. BitCherry测试网络将于12月24日12:00上线
  7. Netflix的Hystrix使用教程
  8. 初步学习pg_control文件之十四
  9. ubuntu16.04中将python3设置为默认
  10. android sdk 转移_腾讯微博java(android)sdk关系链api详细介绍
  11. Android通过包名启动应用程序
  12. 有道云词典--翻译/屏幕取词翻译
  13. big类型和double类型
  14. labelImg安装所遇到的那些坑
  15. idea重启端口占用问题
  16. git 合并部分代码
  17. 量子计算机中证网,电子行业:全球首款纯硅量子计算机芯片诞生
  18. mysql如何加悲观锁_MySQL悲观锁
  19. 「技术综述」人脸妆造迁移核心技术总结
  20. 网络工程师 B站希赛视频第2章操作系统学习笔记

热门文章

  1. linux pdf 编辑图层,PDF SDK DEMO
  2. c语言循环语句实例解释,c语言循环语句(c语言循环语句实例)
  3. 资本寒冬下一个有娃女码农--应聘高级Android工程师历程感言
  4. vue安装vue-pdf(预览pdf)
  5. Visio图片导出不清晰
  6. android View的层级结构
  7. 人工智能与机器学习学习笔记(三)
  8. Minitab数据分析时,无法进行统计变量的选择
  9. 移远EC20 4G模块拨号相关
  10. MySQL数据库数据类型