迭代器,可迭代和迭代究竟是什么?

Python中“可迭代”,“迭代器”和“迭代”的最基本定义是什么? shell

我已经阅读了多个定义,可是我没法肯定确切的含义,由于它仍然不会陷入。 数组

有人能够在外行方面为我提供3个定义的帮助吗? 函数


#1楼

上面的答案很不错,可是正如我所见到的大多数同样,对于像我这样的人来讲,不要过于强调区别工具

一样,人们倾向于经过在__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新手的其余解释,实验和实际经验中了解了我对这个主题的理解。


#2楼

在Python中,一切都是对象。 若是说一个对象是可迭代的,则意味着您能够将对象做为一个集合逐步进行(即迭代)。

例如,数组是可迭代的。 您可使用for循环遍历它们,并从索引0到索引n,n是数组对象的长度减去1。

字典(键/值对,也称为关联数组)也是可迭代的。 您能够逐步浏览他们的键。

显然,不是集合的对象是不可迭代的。 例如,布尔对象只有一个值为True或False。 它不是可迭代的(它是一个可迭代的对象是没有意义的)。

阅读更多。 http://www.lepus.org.uk/ref/companion/Iterator.xml


#3楼

我不知道它是否对任何人都有帮助,但我老是喜欢在脑海中形象化概念以更好地理解它们。 所以,当我有一个小儿子时,我用砖块和白皮书形象化了迭代/迭代器的概念。

假设咱们在黑暗的房间里,在地板上,个人儿子有砖头。 如今,大小,颜色不一样的砖都再也不重要了。 假设咱们有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
>>>

不知道是否有帮助,可是对我有帮助。 若是有人能够确认/纠正该概念的可视化,我将不胜感激。 这将帮助我了解更多信息。


#4楼

iterable = [1, 2] 

iterator = iter(iterable)

print(iterator.__next__())   

print(iterator.__next__())

因此,

  1. iterable是一个能够循环对象 。 例如list,string,tuple等。

  2. 在咱们的iterable对象上使用iter函数将返回一个迭代器对象。

  3. 如今该迭代器对象的方法命名__next__ (在Python 3,或者只是next在Python 2),经过它能够访问可迭代的每一个元素。

所以,以上代码的输出将是:

1个

2


#5楼

在处理迭代器和迭代器以前,决定迭代器和迭代器的主要因素是顺序

顺序:顺序是数据的收集

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
相关文章
相关标签/搜索