深入浅出 Python Iterators 迭代器
原文
- 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 迭代器相关推荐
- Python的迭代器和生成器
Python的迭代器和生成器 一.迭代器Iterators 迭代器仅是一容器对象,它实现了迭代器协议.它有两个基本方法: 1)next方法 返回容器的下一个元素 2)__iter__方法 返回迭代器自 ...
- python有关迭代器和生成器的面试题_【面试题 | Python中迭代器和生成器的区别?】- 环球网校...
[摘要]今天给大家解答一道Python常见的面试题,希望这个面试栏目,给那些准备面试的同学,提供一点点帮助!小编会从最基础的面试题开始,每天一题.如果参考答案不够好,或者有错误的话,麻烦大家可以在留言 ...
- 做一个python的旅游系统_有了它,妈妈再也不担心我感冒了,Python使用迭代器进行天气预报...
上一篇博文我们使用Python制作了一个简单的天气预报小程序(天气渐冷,Python小工具让你随时掌握气温变化,做温暖的穿衣达人).今天,需求有变,如果我们想去旅游,备选方案有北京.上海.广州.新疆等 ...
- python中迭代器的实现原理_Python 进阶应用教程
Python 中的迭代器实现原理 在数学中,集合表示由一个或多个确定的元素所构成的整体.在 Python 中,列表.元组.集合可以用于表示数学中的集合. 例如,分别使用列表.元组.集合表示了一个包含 ...
- C++ Iterators(迭代器)
Iterators迭代器 C++ Iterators(迭代器) 迭代器的描述 对vector容器对象生成和使用了迭代器 C++ Iterators(迭代器) 迭代器可被用来访问一个容器类的所包函的全部 ...
- Python之迭代器
迭代器( iterator) --是访问集合元素的一种方式,迭代器从集合的第一个元素开始访问,直到所有元素被访问结束.并且,迭代器只能向前访问. 优点:不要求事先准备好整个迭代过程中的所有元素,迭代器 ...
- python迭代器好处_关于Python中迭代器的作用
迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...
- 回归素材(part10)--深入浅出python机器学习
学习笔记,仅供参考,有错必纠 文章目录 深入浅出python机器学习 线性回归 基本原理 使用 L 2 L_2 L<
- python中迭代器有哪些_Python迭代器:什么是Python中的迭代器以及如何使用它?
Python编程语言已经扩展了创新的每一个方面,包括机器学习.数据科学.人工智能等,这些概念是Python作为编程语言取得成功的基石.在本文中,我们将通过以下概念来理解Pytho Python编程语言 ...
- python getattr_深入浅出Python模块
引言 上周发表了<老胡讲Python>系列第一篇,得到了很多的关注.在第一篇中,大家表示对模块不是很明白,而模块的概念在Python中是十分重要的,于是今天带来<老胡讲Python& ...
最新文章
- 泛型委托Action与ActionT
- 【Linux驱动】linux内核模块简介
- webpack 4.0 配置文件 webpack.config.js文件的放置位置
- 使用C#操作XML文件
- c语言json映射,GitHub - xujun621/cson: 基于C语言的json数据映射解析库
- BitCherry测试网络将于12月24日12:00上线
- Netflix的Hystrix使用教程
- 初步学习pg_control文件之十四
- ubuntu16.04中将python3设置为默认
- android sdk 转移_腾讯微博java(android)sdk关系链api详细介绍
- Android通过包名启动应用程序
- 有道云词典--翻译/屏幕取词翻译
- big类型和double类型
- labelImg安装所遇到的那些坑
- idea重启端口占用问题
- git 合并部分代码
- 量子计算机中证网,电子行业:全球首款纯硅量子计算机芯片诞生
- mysql如何加悲观锁_MySQL悲观锁
- 「技术综述」人脸妆造迁移核心技术总结
- 网络工程师 B站希赛视频第2章操作系统学习笔记