Python从入门到放弃之迭代器
迭代器是Python2.1中新加入的接口(PEP 234),说明如下:
The iterator provides a 'get next value' operation that
produces the next item in the sequence each time it is called, raising an exception when no more items are available.
说到迭代器,就不得不提迭代器对象(Iterator)和可迭代对象(Iterable)。
接下来将分别介绍这两种对象。
可迭代对象
可迭代对象(Iterable)可以是任何对象,只要该对象拥有__iter__方法。该方法会返回一个迭代对象(Iterator)。
我们常用到的如list,tuple,dict,set,str等都是Iterable。
接下来用list做一些验证。
#!/usr/bin/env python2.7
"""之后所有代码只保留必要部分"""
from collections import Iterator, Iterable
hasattr([], '__iter__') # True
isinstance([], Iterable) # True
type(iter([])) # <type 'list_iterator'>
注:
iter()是内建方法,可将Iterable转为Iterator。
iter()只接受Iterable对象作为参数,如果不是则会抛出TypeError错误。
可以看出,list拥有__iter__方法, 它是一个可迭代对象,当对list使用iter()方法后,会返回一个Iterator对象。
a = [1, 2, 3, 4]
for i in a:
print i
# 实际上内部执行
_iter = iter(a)
while True:
try:
a = _iter.next()
print a
except StopIteration:
break
迭代器对象
迭代器对象则是在可迭代对象的基础上多实现一个next()方法。
class Too(object):
def __init__(self):
self.n = 5
def __iter__(self):
return self
def next(self):
if self.n < 1:
self.n = 5
raise StopIteration
val = self.n
self.n -= 1
return val
t = Too(5)
isinstance(t, Iterable) # True
isinstance(t, Iterator) # True
next(t) # 5
next(t) # 4
next(t) # 3
next(t) # 2
next(t) # 1
next(t) # StopIteration
如上则是实现一个简单的迭代器。
可以看出,只有当使用next()方法时,迭代器才会返回一个值,而且每次返回的都是与之前一次相对应的值,如第一次返回的是5,第二次返回的是4,而不是3或者2或者别的什么数字。
这是因为迭代器内部有一种类似状态机的机制,会保存每次的next()调用后的状态,所以每次调用总会返回正确的结果。
总结
迭代器对象与可迭代对象的关系总结起来就是一句话,迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象。
参考文章:
StackOverflow
nvie.com
generators-uk
Python从入门到放弃之迭代器的更多相关文章
- [Python 从入门到放弃] 6. 文件与异常(二)
本章所用test.txt文件可以在( [Python 从入门到放弃] 6. 文件与异常(一))找到并自行创建 现在有个需求,对test.txt中的文本内容进行修改: (1)将期间的‘:’改为‘ sai ...
- [Python 从入门到放弃] 1. 列表的基本操作
''' 列表 Create By 阅后即焚 On 2018.1.29 ''' 1. 列表的定义 列表看起来好像其它编程语言中的数组,但列表具备更加强大的功能,它是Python完备的集合对象,现在,你可 ...
- Python从入门到放弃系列(Django/Flask/爬虫)
第一篇 Django从入门到放弃 第二篇 Flask 第二篇 爬虫
- python全栈开发从入门到放弃之迭代器生成器
1.python中的for循环 l = [1,2,3,4,5,6] for i in l: #根据索引取值 print(i) 输出结果: 1 2 3 4 5 6 2.iterable 可迭代的 可迭 ...
- Python从入门到放弃
计算机基础 01 计算机基础之编程 02 计算机组成原理 03 计算机操作系统 04 编程语言分类 Python解释器 05 Python和Python解释器 06 执行Python程序的两种方式 0 ...
- [Python 从入门到放弃] 5. 文件与异常(一)
1.文件操作: 文件操作包含读/写 从文件中读取数据 向文件写入数据 Python中内置了open()方法用于文件操作 (更多关于open()BIF介绍 阅读此篇) 基本模板: 1.获取文件对象 2. ...
- [Python 从入门到放弃] 3. BIF(内建函数)
BIF (built-in functions) Python中提供了70多个内建函数,具备大量的现成功能. BIF不需要专门导入,可以直接使用,拿来就用 1.print() # 在屏幕上打印输出 如 ...
- [Python 从入门到放弃] 4. 什么是可选参数
参数在函数中使用,顾名思义.可选参数就是:这个参数是可选的 也就是可有可无 我们来看一下这个例子: ver 1: 1.定义一个迭代输出列表元素的函数myPrint 2.参数为 列表 def myPri ...
- python从入门到放弃--线程进阶
# ### 死锁,递归锁,互斥锁 from threading import Thread,Lock import time noodle_lock = Lock() kuaizi_lock = Lo ...
随机推荐
- ps--记录几个方法步骤
1.图片文字去掉 1.1 矩形工具-->吸管-->alt+delete 1.2 钢笔工具-->Ctrl+回车(变换选区)-->吸管-->alt+delete 2.图层锁不 ...
- ZOJ 1108 & HDU 1160 - FatMouse's Speed
题目大意:给你n只老鼠的体重w和速度s,让你找出最长的子序列使得w[i] < w[j] 且 s[i] > s[j] (i < j).求最长序列的长度并输出该序列. LIS(Longe ...
- iOS 架构模式
参考:http://www.cocoachina.com/ios/20160108/14916.html MVC , MVP , MVVM , VIPER
- gec210 NAND BOOT与SD BOOT启动原理
CPU上电后,此时SP指针指向0x0000_0000,从这个地址取第一条指令.但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低(S5PV210中晶振在CPU旁边,两颗24MHz,一颗2 ...
- windows apache 开启 GZIP
从服务端优化来说,通过对服务端做压缩配置可以大大减小文本文件的体积,从而使加载文本的速度成倍的加快.目前比较通用的压缩方法是启用gzip压缩.它 会把浏览器请求的页面,以及页面中引用的静态资源以压缩包 ...
- Cracking the code interview
推荐一本书<Cracking the code interview> Now in the 5th edition, Cracking the Coding Interview gives ...
- MySQL timestamp NOT NULL插入NULL的问题
explicit_defaults_for_timestamp MySQL 5.6版本引入 explicit_defaults_for_timestamp 来控制对timestamp NULL值的处理 ...
- 第一部分 代码组织概念,集成开发环境(IDE)
代码组织概念 主要是代码文件,项目和解决方案. 解决方案(.sln)包含多个项目(.csproj),一个项目又包含多个文件(.cs). 集成开发环境(IDE): 由编辑.编译.调试,以及用户图形界面, ...
- JS之ONLoad事件
如果我问你window.load和window.onload分别是什么意思,恐怕你会回答我:“这不是页面加载完就执行吗”. 但是答案是不一定,得看你怎么用.看一下例子吧 例1: <!DOCTYP ...
- IOS苹果手机上 iframe 滚动失效条问题,局部滚动开启弹性滚动!
html:bo<div class="scroll-wrapper"> <iframe src=""></iframe> & ...