iterable,iterator和sequence

Iterable
在Python里iterable被认为是一类对象,这类对象能够一次返回它的一个成员(也就是元素)。实际上,任何具有iter()或getitem()方法的对象,Python就认为它是一个iterable。
Python里有大量内置的iterable类型,如: list,str,tuple,dict,file,xrange等。

Sequence
Sequence的字面意思是序列。既然是序列,就应该有成员,且成员之间是有序。当然从理论上讲,序列的成员数可以是无限制的。基
百科是这样定义sequence的:
A sequence is an ordered list. Like a set(集合), it contains members (also called elements, or terms). The number of ordered elements (possibly infinite) is called the length of the sequence.
从定义可以看出sequence有三个特性:

  • 成员
  • 有序
  • 数量

Python里这样定义sequence:
An iterable which supports efficient element access using integer indices via the __getitem__() special method and defines a __len__() method that returns the length of the sequence.
从定义里可以看出,sequence首先是iterable。如果这个iterable可以通过整数索引来访问其元素并可以获得其大小,那么它是sequence。很显然,dict是iterable,但不是sequence,即使它有getitem() 和 len()这两种方法。但它不能通过整数索引而是通过key来获取元素的。

Iterator
Iterator(迭代器)存在于众多面向对象的程序设计语言中,它是一种经典的设计模式。迭代器模式提供一种访问有序集合对象里元素的方式。具体到Python语言里,iterator对象就是实现了迭代协议(iterator protocol)的对象。即实现了两个方法:
__iter__() # 返回迭代器本身
__next__() (Python2使用next())
注意:__iter__方法返回迭代器对象,这个迭代器对象必须是同时实现__iter__和__next__方法的。一个对象的__iter__方法返回迭代器对象时有时可以返回自身(self),如果它同时也实现了__next__方法,也可以返回其它的迭代器对象。
通过iterable, sequence和iterator的定义可以看出这三者的密切关系。下图很好的诠释了它们之间的关系。
这里写图片描述

图中的iter(X)是这样工作的(X是一个iterable):
1. 调用X的__iter__()方法来生成一个iterator。
2. 如果X没有__iter__()方法,Python将会自动构建一个iterator,并尝试通过X[0], X[1], X[2] …或X[key1],x[key2] … 来获取元素。一个重要的例子便是str,str就没有实现__iter__方法。
如果我们仅仅只是需要iterable的元素,而不需要一个完整的list的话,那么用iterator将更有效率并节省空间。
所以
iterable: 实现了__iter__()或__getitem__()方法的对象。
sequence:实现是了sequence protocol(即方法: __getitem__()和__len__()),并能使用整数索引访问元素的iterable对象。
iterator: 实现了iterator protocol(即方法:__next__()和__iter__())的iterable对象。

通过iterable创建iterator的方法:
调用内置函数iter(iterable) -> iterator
或调用自己的iterable.__iter__() -> iterator
注:iterable.__iter__()返回的是一个新的iterator,而iterator.__iter__()返回的iterator对象本身。

最后看一下通过for…in…遍历时,for兼容了两种机制,如果对象有__iter__会使用迭代器访问元素,直到遇到StopIterationException。如果对象没有__iter__,但实现了__getitem__,就会用下标的方式迭代访问元素,直到发生IndexError为止,这是一种旧的迭代协议。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值