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
直到下次