Python中“可迭代”,“迭代器”和“迭代”的最基本定义是什么?
我已经阅读了多个定义,但是我无法确定确切的含义,因为它仍然不会陷入。
有人可以在外行方面为我提供3个定义的帮助吗?
#1楼
上面的答案很不错,但是正如我所见到的大多数一样,对于像我这样的人来说,不要过于强调区别 。
同样,人们倾向于通过在__foo__()
“ X是具有__foo__()
方法的对象”这样的定义来获得“ Python __foo__()
”。 这样的定义是正确的-它们基于鸭子式的哲学,但是当试图以简单的方式理解概念时,对方法的关注往往会介于两者之间。
因此,我添加了我的版本。
用自然语言
- 迭代是在一行元素中一次获取一个元素的过程。
在Python中,
Iterable是一个很好的可迭代对象,简单地说,意味着可以在迭代中使用它,例如,使用
for
循环。 怎么样? 通过使用迭代器 。 我会在下面解释。...,而迭代器是一个对象,它定义了如何实际执行迭代-特别是下一个元素是什么 。 这就是为什么它必须具有
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__())
所以,
iterable
是一个可以循环的对象 。 例如list,string,tuple等。在我们的
iterable
对象上使用iter
函数将返回一个迭代器对象。现在该迭代器对象的方法命名
__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
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3163477