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 ...
随机推荐
- java实现——004替换空格
1.创建新的字符串 public class T004 { public static void main(String[] args){ System.out.println(replaceBlan ...
- EF 实体字段设置主键和自增
[Key] //主键 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] //设置自增 public int id { get; set; } ...
- php实现MD5加密16位(不要默认的32位)
使用substr函数截取: substr(md5("admin"),8,16); // 16位MD5加密 md5("admin"); // 32位MD5加密
- Spark中的键值对操作
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Quartz2D 之 简单介绍
1. 概述 Quartz2D 是一个二维绘图引擎. 主要功能: 绘制图形:线.矩形.圆.弧 绘制文字 绘制图片 绘制PDF 裁截图片 自定义UI控件 2. 图形上下文 Graphics Context ...
- Zepto.js入门介绍
GitHub Zepto Zepto的一些可选功能是专门针对移动端浏览器的:因为它的最初目标在移动端提供一个精简的类似jquery的js库. Zepto不支持旧版本的Internet Explorer ...
- 与文件上传到的三个类:FileItem类、ServletFileUpload 类、DiskFileItemFactory类
文件上传: ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中, 在使用ServletFileUpload对象解析请求时需要根据DiskFi ...
- JS 继承(类式 与 原型式)
1. /* -- 类式继承 -- *///先声明一个超类 function Person(name) { this.name = name;}//给这个超类的原型对象上添加方法 getName Per ...
- Promise基础
前言: ES2015将Promise引入语言规范,包括fetch等在内的API也构建在Promise之上.作为让js摆脱“回调地狱”的重要一环和众多框架中的重要基础设施之一,学习如何自己实现一个Pro ...
- androidTv界面刷新跳动的问题
今天刚完成老大要求的新模块,在界面刷新的时候遇到了一些问题:一个scrollview动态的添加控件且控件中的数据进行更换的时候,出现的界面跳动的问题 刚开始以为是界面没有展示完全配合scrollvie ...