Carlos A. Gómez Asked: 2020-07-08 16:40:51 +0800 CST 2020-07-08 16:40:51 +0800 CST 2020-07-08 16:40:51 +0800 CST Python 3 中可迭代、迭代器和序列对象之间的区别 772 我已经看到,在 Python 3 中有iterable类型的对象,iterator类型的对象,还有序列。我的问题是: 有什么区别?它们都可以循环遍历吗?它们都可以通过索引访问吗?它们都包含内存中的元素还是交互生成的? python 1 Answers Voted Best Answer Carlos A. Gómez 2020-07-08T16:40:51+08:002020-07-08T16:40:51+08:00 这是对每种类型的解释以澄清差异: 迭代器:迭代器类型对象是表示数据流的对象,它可以在迭代过程中进行遍历,例如循环for、函数内部、列表理解map或生成器filter的创建或比较中。in 每个迭代器对象都包含一个__next__()在每次迭代时调用的已实现方法,每次都返回数据流的连续元素。对象的数据流不必存储在内存中,而是可以在每次迭代中实时生成。 迭代器对象保存一个内部状态以了解获得的最后一个元素是什么。因此,在下一次调用 时__next__(),将返回下一个正确的元素。 当迭代器的数据流中没有更多元素时,函数__next__()会触发StopIteration。当到达流的末尾或再次开始循环时,内部状态不会自动重置。也就是说,它只能遍历一次。 此外,它还实现了__iter__()返回迭代器对象本身的方法。这是能够使用迭代器对象实现循环所必需的,我们将在后面解释。 可迭代:可迭代对象是一种对象类型,一次返回一个元素。它实现了以下两种方法之一: __iter__()从这个可迭代对象返回一个迭代器对象。 __getitem__()它访问从 0 开始的索引的每个元素。 可迭代对象不必定义方法__next__()。相反,有义务实现该方法,__iter__()或者__getitem__(),它可以用作函数的参数iter(),从而遍历生成的迭代器。 序列:它是一个集合对象,它定义了方法__getitem__()(除了序列是可变的,__setitem__()或者__delitem__()如果序列是可变的)来访问序列的元素。作为参数传递__getitem__()给序列的值是索引或切片对象。 还有另一种类型的集合对象称为映射器(映射),它也定义了方法__getitem__(),不同之处在于参数传递的值是唯一键。此外,像序列一样,如果映射器__setitem__()是可变的,它定义了or方法__delitem__()。 该函数__getitem__()通过使用[]带有方括号括起来的访问参数值的运算符隐式执行。 序列和映射器都定义了__len__()e方法__iter__(),因为它们都是集合。第一个允许在作为参数传递给函数时返回集合len()元素的长度。第二个是因为集合是可迭代的。 列表和元组是序列集合的示例,它们也可以通过实现和方法进行迭代(对于从 0 开始的索引)。但相反,它们不是迭代器,因为它们不包含方法__iter__()__getitem__()__next__() functioniter()是 Python 语言的一部分,它从包含 method 或包含从 0 开始的索引的方法的对象返回一个迭代器(如果索引不存在则抛出)。如果它不包含这两种方法中的任何一种,则该函数将进行强制转换,而不是从对象返回迭代器。__iter__()__getitem__()IndexErroriter()TypeError 该函数iter()总是在迭代开始时作为循环隐式调用for。这个函数被传递给你想要迭代的可迭代对象,返回一个将被遍历的新迭代器。出于这个原因,迭代器对象必须有一个方法__iter__(): 以便iter()在开始迭代之前总是在要迭代的对象上执行的函数返回迭代器__next__()本身(而不在每次调用时重置其状态iter())。 该函数iter()还可以从函数(实现了该方法的对象)而不是可迭代对象生成迭代器。为此,将第一个参数传递给将在 each 中不带参数调用的函数,并将完成值作为第二个参数传递。当每次迭代调用的函数返回完成值时,迭代器将停止提供元素。__call__()iter()__next()__StopIteration__next()__ 最后,尽管Iterable它们是在包含抽象方法Iterator的模块中定义的抽象类或. 因此,继承自的类的实例必须实现该方法(通过满足iterables的上述条件之一);并且继承自的类的实例必须实现方法并满足上面解释的迭代器条件。collections.abc__iter__()__next__()Iterable__iter__()Iterator__iter__()__next__()
这是对每种类型的解释以澄清差异:
迭代器:迭代器类型对象是表示数据流的对象,它可以在迭代过程中进行遍历,例如循环
for
、函数内部、列表理解map
或生成器filter
的创建或比较中。in
每个迭代器对象都包含一个
__next__()
在每次迭代时调用的已实现方法,每次都返回数据流的连续元素。对象的数据流不必存储在内存中,而是可以在每次迭代中实时生成。迭代器对象保存一个内部状态以了解获得的最后一个元素是什么。因此,在下一次调用 时
__next__()
,将返回下一个正确的元素。当迭代器的数据流中没有更多元素时,函数
__next__()
会触发StopIteration
。当到达流的末尾或再次开始循环时,内部状态不会自动重置。也就是说,它只能遍历一次。此外,它还实现了
__iter__()
返回迭代器对象本身的方法。这是能够使用迭代器对象实现循环所必需的,我们将在后面解释。可迭代:可迭代对象是一种对象类型,一次返回一个元素。它实现了以下两种方法之一:
__iter__()
从这个可迭代对象返回一个迭代器对象。__getitem__()
它访问从 0 开始的索引的每个元素。可迭代对象不必定义方法
__next__()
。相反,有义务实现该方法,__iter__()
或者__getitem__()
,它可以用作函数的参数iter()
,从而遍历生成的迭代器。序列:它是一个集合对象,它定义了方法
__getitem__()
(除了序列是可变的,__setitem__()
或者__delitem__()
如果序列是可变的)来访问序列的元素。作为参数传递__getitem__()
给序列的值是索引或切片对象。还有另一种类型的集合对象称为映射器(映射),它也定义了方法
__getitem__()
,不同之处在于参数传递的值是唯一键。此外,像序列一样,如果映射器__setitem__()
是可变的,它定义了or方法__delitem__()
。该函数
__getitem__()
通过使用[]
带有方括号括起来的访问参数值的运算符隐式执行。序列和映射器都定义了
__len__()
e方法__iter__()
,因为它们都是集合。第一个允许在作为参数传递给函数时返回集合len()
元素的长度。第二个是因为集合是可迭代的。列表和元组是序列集合的示例,它们也可以通过实现和方法进行迭代(对于从 0 开始的索引)。但相反,它们不是迭代器,因为它们不包含方法
__iter__()
__getitem__()
__next__()
function
iter()
是 Python 语言的一部分,它从包含 method 或包含从 0 开始的索引的方法的对象返回一个迭代器(如果索引不存在则抛出)。如果它不包含这两种方法中的任何一种,则该函数将进行强制转换,而不是从对象返回迭代器。__iter__()
__getitem__()
IndexError
iter()
TypeError
该函数
iter()
总是在迭代开始时作为循环隐式调用for
。这个函数被传递给你想要迭代的可迭代对象,返回一个将被遍历的新迭代器。出于这个原因,迭代器对象必须有一个方法__iter__()
: 以便iter()
在开始迭代之前总是在要迭代的对象上执行的函数返回迭代器__next__()
本身(而不在每次调用时重置其状态iter()
)。该函数
iter()
还可以从函数(实现了该方法的对象)而不是可迭代对象生成迭代器。为此,将第一个参数传递给将在 each 中不带参数调用的函数,并将完成值作为第二个参数传递。当每次迭代调用的函数返回完成值时,迭代器将停止提供元素。__call__()
iter()
__next()__
StopIteration
__next()__
最后,尽管
Iterable
它们是在包含抽象方法Iterator
的模块中定义的抽象类或. 因此,继承自的类的实例必须实现该方法(通过满足iterables的上述条件之一);并且继承自的类的实例必须实现方法并满足上面解释的迭代器条件。collections.abc
__iter__()
__next__()
Iterable
__iter__()
Iterator
__iter__()
__next__()