迭代器是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)。

我们常用到的如listtupledictsetstr等都是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从入门到放弃之迭代器的更多相关文章

  1. [Python 从入门到放弃] 6. 文件与异常(二)

    本章所用test.txt文件可以在( [Python 从入门到放弃] 6. 文件与异常(一))找到并自行创建 现在有个需求,对test.txt中的文本内容进行修改: (1)将期间的‘:’改为‘ sai ...

  2. [Python 从入门到放弃] 1. 列表的基本操作

    ''' 列表 Create By 阅后即焚 On 2018.1.29 ''' 1. 列表的定义 列表看起来好像其它编程语言中的数组,但列表具备更加强大的功能,它是Python完备的集合对象,现在,你可 ...

  3. Python从入门到放弃系列(Django/Flask/爬虫)

    第一篇 Django从入门到放弃 第二篇 Flask 第二篇 爬虫

  4. 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  可迭代的 可迭 ...

  5. Python从入门到放弃

    计算机基础 01 计算机基础之编程 02 计算机组成原理 03 计算机操作系统 04 编程语言分类 Python解释器 05 Python和Python解释器 06 执行Python程序的两种方式 0 ...

  6. [Python 从入门到放弃] 5. 文件与异常(一)

    1.文件操作: 文件操作包含读/写 从文件中读取数据 向文件写入数据 Python中内置了open()方法用于文件操作 (更多关于open()BIF介绍 阅读此篇) 基本模板: 1.获取文件对象 2. ...

  7. [Python 从入门到放弃] 3. BIF(内建函数)

    BIF (built-in functions) Python中提供了70多个内建函数,具备大量的现成功能. BIF不需要专门导入,可以直接使用,拿来就用 1.print() # 在屏幕上打印输出 如 ...

  8. [Python 从入门到放弃] 4. 什么是可选参数

    参数在函数中使用,顾名思义.可选参数就是:这个参数是可选的 也就是可有可无 我们来看一下这个例子: ver 1: 1.定义一个迭代输出列表元素的函数myPrint 2.参数为 列表 def myPri ...

  9. python从入门到放弃--线程进阶

    # ### 死锁,递归锁,互斥锁 from threading import Thread,Lock import time noodle_lock = Lock() kuaizi_lock = Lo ...

随机推荐

  1. cocoaPods的安装使用 以及 Carthage

    http://cnbin.github.io/blog/2015/05/25/cocoapods-an-zhuang-he-shi-yong/ 按照这个步骤就OK Note:当引入已有的project ...

  2. 解决VirtualBox下安装虚拟机(Ubuntu)出错(不能为虚拟电脑Ubuntu打开一个新的任务)的有关问题

    [转]http://www.myexception.cn/program/1964906.html 解决VirtualBox下安装虚拟机(Ubuntu)出错(不能为虚拟电脑Ubuntu打开一个新的任务 ...

  3. 匿名函数里的this的执行环境和指向--javascript

    重新看了下闭包,在javascript高级程序设计第二版里的闭包里有如下例子,例子中介绍说匿名函数的执行环境具有全局性和this指向window,对于这句话很费解,所以就想个方法验证下. var na ...

  4. 使用django-compressor压缩静态文件

    Reference:http://blog.csdn.net/permike/article/details/52355095 在网站开发阶段,对于静态资源文件比如JS,CSS等文件都是未经过压缩合并 ...

  5. runat="server"

    加runat="server"表示该控件是服务器端控件,不加表示是客户端控件. runat="server"直接回交服务器,处理数据,又以数据加密后的hidde ...

  6. UWP 中实现一个颜色选择器 UWPColorPickerControl

    最近在实现一个远程数字白板时,发现UWP平台上颜色选择不方便,因此自己动手写了一个. 效果图 实现 <UserControl x:Class="UWPColorPickerLibrar ...

  7. Eclipse tomcat插件

    1. 下载 http://www.eclipsetotale.com/tomcatPlugin.html 2. 解压 解压到Eclipse_Home/dropins 3. 重启Eclipse

  8. SVN官方版本下载地址

    TortoiseSVN 客户端 &  Language packs 语言包 : https://tortoisesvn.net/downloads.html VisualSVN 插件官方地址: ...

  9. SecureCRT 选择Courier New等其他字体.

    http://justwinit.cn/post/5813/ 如何解决SecureCRT无法选择Courier New等其他字体最终解决办法:到C:\Windows\Fonts目录下,找到Courie ...

  10. Myeclipse8.5 反编译插件 jad 安装(转)

    准备工作 下载jad.exe文件:http://www.varaneckas.com/sites/default/files/jad/jad158g.win.zip 下载jadeclipse插件:ht ...