在Python中揭开迭代和迭代器的神秘面纱
#编程 #python #code

Python迭代协议中的两个基本概念是迭代和迭代器。尽管这些术语听起来可能相似,但它们具有独特的角色和行为。在本文中,我们将探讨迭代和迭代器之间的关键差异,以及它们如何帮助我们在Python中有效地遍历数据。

了解迭代

在python中,一个能够一次返回其元素的对象。它代表了可以迭代的项目集合。内置迭代的示例包括列表,元组,字符串和词典。

让我们考虑一个列表的简单示例:

my_list = [1,2,3,4]
for i in my_list:
    print (i)

输出:

1
2
3
4

也许更基本的,而出于解释的目的,我们可以将一个具有__iter__()方法的对象视为对象。

print(dir(my_list))

输出:

['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

这是事物变得有趣的地方!
__iter__()方法基本上返回迭代器对象。此对象是for关键字所循环的。

请看一下:

my_list = [1,2,3,4]
my_iterator_list = my_list.__iter__()
print(i_my_list)

输出:

<list_iterator object at 0x7f3abd6eaa30>

但是我们要领先于自己...

什么是迭代器?

迭代器是实现迭代协议的对象,可以通过迭代对象启用迭代。他们保持迭代状态并提供了一种依次访问元素的机制。

哇!那是很多迭代。但是我们是什么意思?

本质上,迭代器是使迭代(循环)成为可能的原因。您的列表或字符串(iTable)首先将其转换为迭代对象,然后才能迭代。我们之前说过,这是通过__iter__()方法完成的。 Python还具有内置的iter()函数,可以执行相同的操作。

my_list = [1,2,3,4]
my_iterator_list = iter(my_list)
print(i_my_list)

输出:

<list_iterator object at 0x7f3abd6eaa30>

一个迭代器,除了具有像峰值这样的__iter__()方法外,还具有其特征性的__next__()方法。

print(dir(my_iterator_list))

输出:

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']

__next__()方法返回迭代中的下一个元素。当没有更多元素迭代时,此方法会提高StopIteration异常。当然,Python具有内置的next()功能。

my_list = [1,2,3,4]
my_iterator_list = iter(my_list)

print(next(my_iterator_list))
print(next(my_iterator_list))
print(next(my_iterator_list))
print(next(my_iterator_list))
print(next(my_iterator_list))

输出:

1
2
3
4
Traceback (most recent call last):
  File "/home/kenn-stack/python test.py", line 32, in <module>
    print(next(my_iterator_list))
StopIteration

迭代和迭代关系

要注意的一个重要点是,迭代器也是一个迭代仪,但并非所有迭代都是迭代器。

n.b:迭代器的__iter__()方法只是返回self,因为它已经是迭代器。

一个实用的例子

让我们考虑模仿Python for操作的定制代码。它也捕获了StopIteration异常。

my_list = [1,2,3,4]
my_iterator_list = iter(my_list)

while True:
    try:
        looped = next(my_iterator_list)
        print(looped)
    except StopIteration:
        break

输出:

1
2
3
4

作为第一个示例!

就是这样。不要忘记喜欢和评论。
ciao
直到下次