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 ...
随机推荐
- leetcode day6
[13]Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be with ...
- TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免
TCP的拥塞控制 1. 拥塞:即对资源的需求超过了可用的资源.若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降. 拥塞控制:防止过多的数据注入到网络中,这样 ...
- WebForm和MVC中都可以使用的路由
1.在global.asax void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 // RouteConfig. ...
- android dialog圆角显示及解决出现的黑色棱角.(友情提示)
http://blog.csdn.net/jj120522/article/details/7871289 最近在开发一个天气预报的app,看到一个比较不错友情提示,如下: ...
- Linux用户和用户组管理总结
Linux下和用户和用户组管理有关的配置文件: /etc/group Group account information. /etc/gshadow Secure group account info ...
- WEB 开发者应该具备的 6 大技能?
1. 界面和用户体验 注意,浏览器的实现标准是不一致的,请确保你的网站能够兼容所有主流的浏览器.最少需要测试的有 Gecko 引擎 (Firefox),WebKit引擎(Safari以及一些手机浏览器 ...
- Selenium2(java)TestNG的使用 七
TestNG,即Testing Next Generation,下一代测试技术,是一套根据JUnit和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用来做 ...
- javascript的页面加载及性能优化(兼容IE7)
通常来说,window.onload就够用了,如果想加载多个事件,我们可以采取以下方式: window.onload = function(){ func1(); func ...
- AJAX 跨域请求的解决办法:使用 JSONP获取JSON数据
由于受到浏览器的限制,ajax不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.如果能控制数据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误.但是,如果仅停留在自己的服务器 ...
- Mac下启动MySQL出现错误“the /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' user”解决
错误如下: Warring the /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' user 这应该是某 ...