Python中“可迭代”,“迭代器”和“迭代”的最基本定义是什么? shell
我已经阅读了多个定义,可是我没法肯定确切的含义,由于它仍然不会陷入。 数组
有人能够在外行方面为我提供3个定义的帮助吗? 函数
上面的答案很不错,可是正如我所见到的大多数同样,对于像我这样的人来讲,不要过于强调区别 。 工具
一样,人们倾向于经过在__foo__()
“ X是具备__foo__()
方法的对象”这样的定义来得到“ Python __foo__()
”。 这样的定义是正确的-它们基于鸭子式的哲学,可是当试图以简单的方式理解概念时,对方法的关注每每会介于二者之间。 测试
所以,我添加了个人版本。 spa
用天然语言 线程
在Python中, code
Iterable是一个很好的可迭代对象,简单地说,意味着能够在迭代中使用它,例如,使用for
循环。 怎么样? 经过使用迭代器 。 我会在下面解释。 xml
...,而迭代器是一个对象,它定义了如何实际执行迭代-特别是下一个元素是什么 。 这就是为何它必须具备next()
方法的缘由。 对象
迭代器自己也是可迭代的,区别在于其__iter__()
方法返回相同的对象( self
),而无论其先前调用next()
是否已消耗其对象。
那么,Python解释器for x in obj:
语句中看到for x in obj:
时会怎么想?
看,一个
for
循环。 看起来像是一个迭代器的工做...让咱们获得一个。 ...有这个obj
家伙,让咱们问他。“
obj
先生,您有迭代器吗?” (...调用iter(obj)
,它调用obj.__iter__()
,它高兴地发出了一个闪亮的新迭代器_i
。)好的,那很简单...让咱们开始迭代。 (
x = _i.next()
...x = _i.next()
...)
因为obj
先生在该测试中成功(经过某种方法返回了有效的迭代器),咱们用形容词来奖励他:您如今能够称他为“可迭代的obj
先生”。
可是,在简单的状况下,一般不会从分别拥有Iterator和Iterable中受益。 所以,您仅定义一个对象,这也是它本身的迭代器。 (Python并不真的关心obj
发出的_i
并非那么闪亮,而仅仅是obj
自己。)
这就是为何在我见过的大多数示例中(以及一遍又一遍使我困惑的缘由)中,您能够看到:
class IterableExample(object): def __iter__(self): return self def next(self): pass
代替
class Iterator(object): def next(self): pass class Iterable(object): def __iter__(self): return Iterator()
可是,在某些状况下,能够从使迭代器与可迭代的对象分离中受益,例如,当您但愿有一行项目,但须要更多“游标”时。 例如,当您要使用“当前”和“即将到来”的元素时,能够为这两个元素使用单独的迭代器。 或从庞大列表中提取多个线程:每一个线程均可以具备本身的迭代器以遍历全部项目。 见@雷蒙德和@ glglgl的上述回答。
想象一下您能够作什么:
class SmartIterableExample(object): def create_iterator(self): # An amazingly powerful yet simple way to create arbitrary # iterator, utilizing object state (or not, if you are fan # of functional), magic and nuclear waste--no kittens hurt. pass # don't forget to add the next() method def __iter__(self): return self.create_iterator()
笔记:
我将再次重复: 迭代器不可迭代 。 迭代器不能用做for
循环中的“源”。 for
循环主要须要的是__iter__()
(该__iter__()
返回next()
)。
固然, for
并非惟一的迭代循环,所以上述内容一样适用于某些其余构造( while
...)。
迭代器的next()
能够抛出StopIteration以中止迭代。 可是,它没必要永久地迭代或使用其余方式。
在上面的“思考过程”中, _i
实际上并不存在。 我叫这个名字。
Python 3.x有一个小的变化: next()
方法(不是内置方法)如今必须称为__next__()
。 是的,一直以来都是这样。
您也能够这样想:可迭代拥有数据,迭代器提取下一项
免责声明:我不是任何Python解释器的开发人员,因此我真的不知道解释器的想法。 上面的沉思只是我如何从Python新手的其余解释,实验和实际经验中了解了我对这个主题的理解。
在Python中,一切都是对象。 若是说一个对象是可迭代的,则意味着您能够将对象做为一个集合逐步进行(即迭代)。
例如,数组是可迭代的。 您可使用for循环遍历它们,并从索引0到索引n,n是数组对象的长度减去1。
字典(键/值对,也称为关联数组)也是可迭代的。 您能够逐步浏览他们的键。
显然,不是集合的对象是不可迭代的。 例如,布尔对象只有一个值为True或False。 它不是可迭代的(它是一个可迭代的对象是没有意义的)。
阅读更多。 http://www.lepus.org.uk/ref/companion/Iterator.xml
我不知道它是否对任何人都有帮助,但我老是喜欢在脑海中形象化概念以更好地理解它们。 所以,当我有一个小儿子时,我用砖块和白皮书形象化了迭代/迭代器的概念。
假设咱们在黑暗的房间里,在地板上,个人儿子有砖头。 如今,大小,颜色不一样的砖都再也不重要了。 假设咱们有5块这样的砖。 能够将这5块砖描述为一个对象 -假设是砖块套件 。 使用此积木工具包,咱们能够作不少事情–能够先取一个,而后取第二,再取第三,能够更改积木的位置,将第一个积木放在第二个之上。 咱们能够用这些作不少事情。 所以,这个积木工具包是一个可迭代的对象或序列,由于咱们能够遍历每一个积木并对其进行处理。 咱们只能作到像个人小儿子-咱们能够在一个时间 一个砖头打。 因此我再次觉得本身这个套砖工具是一个可迭代的工具 。
如今请记住,咱们在黑暗的房间里。 或几乎是黑暗的。 问题是咱们没有清楚地看到这些砖块,它们是什么颜色,什么形状等。所以,即便咱们想对它们作些事情(也就是遍历它们) ,咱们也不知道究竟是什么以及如何作,由于它是太黑了。
咱们所能作的就是接近第一个砖块(做为砖块工具包的组成部分),咱们能够放一张白色荧光纸,以便咱们了解第一个砖块元素的位置。 每次咱们从工具包中取出一块砖块时,都会将白纸替换为下一块砖块,以便可以在黑暗的房间中看到它。 这张白纸只不过是一个迭代器 。 它也是一个对象 。 可是,具备可工做和可迭代对象的元素的对象–砖块工具包。
顺便说一下,这解释了我在IDLE中尝试如下操做并遇到TypeError时的早期错误:
>>> X = [1,2,3,4,5] >>> next(X) Traceback (most recent call last): File "<pyshell#19>", line 1, in <module> next(X) TypeError: 'list' object is not an iterator
清单X是咱们的积木工具包,但不是白纸。 我须要先找到一个迭代器:
>>> X = [1,2,3,4,5] >>> bricks_kit = [1,2,3,4,5] >>> white_piece_of_paper = iter(bricks_kit) >>> next(white_piece_of_paper) 1 >>> next(white_piece_of_paper) 2 >>>
不知道是否有帮助,可是对我有帮助。 若是有人能够确认/纠正该概念的可视化,我将不胜感激。 这将帮助我了解更多信息。
iterable = [1, 2] iterator = iter(iterable) print(iterator.__next__()) print(iterator.__next__())
因此,
iterable
是一个能够循环的对象 。 例如list,string,tuple等。
在咱们的iterable
对象上使用iter
函数将返回一个迭代器对象。
如今该迭代器对象的方法命名__next__
(在Python 3,或者只是next
在Python 2),经过它能够访问可迭代的每一个元素。
所以,以上代码的输出将是:
1个
2
在处理迭代器和迭代器以前,决定迭代器和迭代器的主要因素是顺序
顺序:顺序是数据的收集
Iterable:Iterable是支持Iter方法的序列类型对象。
Iter方法:Iter方法将序列做为输入并建立一个称为迭代器的对象
Iterator:Iterator是调用next方法并遍历整个序列的对象。调用next方法时,它将返回当前遍历的对象。
例:
x=[1,2,3,4]
x是一个由数据收集组成的序列
y=iter(x)
调用iter(x)时,仅当x对象具备iter方法时才返回迭代器,不然会引起异常。若是返回iterator,则y的分配方式以下:
y=[1,2,3,4]
因为y是迭代器,所以它支持next()方法
调用next方法时,它会一步一步返回列表的各个元素。
返回序列的最后一个元素后,若是再次调用下一个方法,则会引起StopIteration错误
例:
>>> y.next() 1 >>> y.next() 2 >>> y.next() 3 >>> y.next() 4 >>> y.next() StopIteration