Python 可迭代对象和迭代器的区别
什么是可迭代对象
可迭代对象可以被简单地定义为传递给内置方法iter()时会生成一个迭代器的对象。对于一个对象来说,要成为可迭代对象,类的对象需要定义两个实例方法:__len__
和__getitem__
。当将满足这些条件的对象传递给iter()方法时,会生成一个迭代器。
迭代器
迭代器被定义为通过内部状态变量来计数迭代的对象。在这种情况下,当迭代跨过最后一个项时,变量并不被设置为零,而是引发StopIteration()来表示迭代的结束。
可迭代对象与迭代器的区别
让我们通过一个示例来查看可迭代对象和迭代器之间的区别-
基础 | 可迭代对象 | 迭代器 |
---|---|---|
是什么? | 可迭代对象是可以进行迭代的对象。 | 迭代器定义为通过内部状态变量计数迭代的对象。 |
关系 | 每个迭代器都是可迭代的。 | 并非每个可迭代对象都是迭代器。 |
迭代方法 | 将对象传递给内置方法iter()时,会生成一个迭代器。 | next()方法用于迭代。 |
列表 | 列表是可迭代对象。 | 列表不是迭代器。 |
示例
在下面的示例中,我们有一个名为 Cars 的类,它既可以被迭代,又可以作为迭代器。Cars 类是一个迭代器,因为它实现了:
__iter__
方法返回对象本身,-
__next__
方法返回列表中的下一个项。
Cars 类也是可迭代的,因为它实现了:
__iter__
方法返回一个对象本身,这个对象是一个迭代器。
现在让我们来看一下示例:
class Cars:
def __init__(self):
self.rgb = ['bmw', 'audi', 'benz', 'tesla']
self.__index = 0
def __iter__(self):
return self
def __next__(self):
if self.__index >= len(self.rgb):
raise StopIteration
# return the next car name
car = self.rgb[self.__index]
self.__index += 1
return car