Python 中的可迭代对象和迭代器

原文:https://www.studytonight.com/python/python-iterable-and-iterator

在 python 或任何其他编程语言中,迭代意味着通常使用循环一个接一个地访问某个东西的每个项目。例如,如果我们有一个汽车名称列表,并且我们想要一个接一个地打印所有名称,我们可以使用 for循环来完成,如下所示:

# list of cars
cars = ['Audi', 'BMW', 'Jaguar', 'Kia', 'MG', 'Skoda']

for car in cars:
  print("Name of car: ", car)

车名:奥迪车名:宝马车名:捷豹车名:起亚车名:MG 车名:斯柯达

我们在上面的代码中所做的是迭代,涉及到逐个访问列表中的所有项目。


什么是 Iterable?

在 python 编程中,可迭代对象是任何可以循环或迭代的东西。比如列表元组字典 等。都是可重复的。简单地说,任何可以出现在 for 循环右侧的东西都是可迭代的。

iterable 的一个重要属性是它有一个__iter__()方法或iter()方法,允许任何 iterable 返回迭代器对象。

iter()方法在内部调用__iter__()方法并返回迭代器对象。


什么是迭代器?

迭代器是一个可以循环的对象,它在迭代过程中保持其状态,这意味着它在迭代过程中记住它在哪里。

它有一个__next__()方法,在迭代中返回下一个值,并将状态更新为指向下一个值。

迭代器还有返回self对象的 __iter__()方法。


从 Iterable 获取迭代器对象

我们可以通过向iter()方法传递预定义或预创建的可迭代对象,或者在该可迭代对象上使用__iter__()方法,轻松获得迭代器对象。

例如:

在上例中,我们使用了iter()方法,我们也可以尝试使用__iter__()方法,如下所示:

# we can use __iter__() method too
cars_iter_new = cars.__iter__()

# print the data
print(cars_iter_new.__next__())

如上例所示,next()__next__()方法递增相应迭代器的状态,并返回前一个值旁边的值。

另外,您一定注意到了输出中的一个异常。excition 是StopIteration异常,当迭代器中没有剩余值要迭代时,即列表结束后,我们仍然尝试调用next()__next()方法时,就会出现该异常。


for Loop 内部就是这样工作的吗?

嗯是的!python 没有陷入获取迭代器对象然后一次又一次调用下一个函数的所有麻烦,而是为我们提供了像for循环这样的循环,它在内部执行上述所有步骤。

所以当我们使用像这样的for循环时:

# list of cars
cars = ['Audi', 'BMW', 'Jaguar', 'Kia', 'MG', 'Skoda']

for car in cars:
  print("Name of car: ", car)

在内部,for循环这样做:

# iterator object is created
iter_obj = iter(cars)

while True:
    try:
        element = next(iter_obj)
        # perform some operation like print the value
    except StopIteration:
        # break out of loop when the list ends 
        break

forpython 中的循环是为了轻松迭代 iterables 而创建的,现在我们知道了它是如何使用 ITER 对象在内部工作的。


通过创建自定义迭代器使类可迭代

现在让我们学习如何制作自己的迭代器。制作自己的迭代器超级容易,我们要做的就是实现方法__iter__()__next()

__iter__()方法将返回迭代器的一个对象,在我们的例子中,它将是类本身的对象。

并且__next__()方法应该在每次被调用时返回下一个元素,并且应该在到达结束时引发StopIteration异常。

下面我们有一个简单的类Counting,它将打印从 1 开始的计数,直到初始化类时您提供的数字。

您也可以尝试在Counting类的对象上调用iter()方法,然后在迭代器上使用next()方法逐个打印值。