迭代器是遍历列表、元组等集合的方法。使用迭代器方法,我们可以循环遍历一个对象并返回其元素。
从技术上讲,Python 迭代器对象必须实现两个特殊方法,__iter__()
和 __next__()
,它们统称为迭代器协议。
遍历迭代器
在 Python 中,我们可以使用 next() 函数返回序列中的下一个项。
让我们看一个例子,
# define a list
my_list = [4, 7, 0]
# create an iterator from the list
iterator = iter(my_list)
# get the first element of the iterator
print(next(iterator)) # prints 4
# get the second element of the iterator
print(next(iterator)) # prints 7
# get the third element of the iterator
print(next(iterator)) # prints 0
输出
4 7 0
这里,我们首先使用 iter() 方法从列表中创建了一个迭代器。然后使用 next()
函数按顺序检索迭代器的元素。
当我们到达末尾并且没有更多数据可返回时,我们将得到 StopIteration
异常。
使用 for 循环
一种更优雅的自动迭代方式是使用 for 循环。例如,
# define a list
my_list = [4, 7, 0]
for element in my_list:
print(element)
输出
4 7 0
for 循环对迭代器的工作原理
Python 中的 for
循环用于遍历一系列元素,例如列表、元组或字符串。
当我们使用 for
循环与迭代器时,循环将自动遍历迭代器的元素,直到迭代器耗尽。
以下是 for
循环与迭代器协同工作的示例:
# create a list of integers
my_list = [1, 2, 3, 4, 5]
# create an iterator from the list
iterator = iter(my_list)
# iterate through the elements of the iterator
for element in iterator:
# Print each element
print(element)
在此示例中,for
循环遍历迭代器对象的元素。
在每次迭代中,循环将下一个元素的值分配给变量 element,然后执行缩进的代码块。
此过程持续进行,直到迭代器耗尽,此时 for 循环终止。
构建自定义迭代器
在 Python 中从头开始构建迭代器很容易。我们只需实现 __iter__()
和 __next__()
方法,
__iter__()
返回迭代器对象本身。如果需要,可以执行一些初始化。
__next__()
必须返回序列中的下一个项目。到达末尾后,以及在随后的调用中,它必须引发StopIteration
。
让我们看一个示例,它将在每次迭代中为我们提供 2 的下一个幂。幂指数从零开始,直到用户设置的数字,
class PowTwo:
"""Class to implement an iterator
of powers of two"""
def __init__(self, max=0):
self.max = max
def __iter__(self):
self.n = 0
return self
def __next__(self):
if self.n <= self.max:
result = 2 ** self.n
self.n += 1
return result
else:
raise StopIteration
# create an object
numbers = PowTwo(3)
# create an iterable from the object
i = iter(numbers)
# Using next to get to the next iterator element
print(next(i)) # prints 1
print(next(i)) # prints 2
print(next(i)) # prints 4
print(next(i)) # prints 8
print(next(i)) # raises StopIteration exception
输出
1 2 4 8 Traceback (most recent call last): File "<string>", line 32, in <module> File "<string>", line 18, in __next__ StopIteration
我们还可以使用 for
循环遍历我们的迭代器类。
for i in PowTwo(3):
print(i)
输出
1 2 4 8
要了解有关面向对象编程的更多信息,请访问 Python OOP。
Python 无限迭代器
无限迭代器是一种永不结束的迭代器,这意味着它将无限期地生成元素。
以下是使用 itertools
模块中的 count()
函数在 Python 中创建无限迭代器的示例:
from itertools import count
# create an infinite iterator that starts at 1 and increments by 1 each time
infinite_iterator = count(1)
# print the first 5 elements of the infinite iterator
for i in range(5):
print(next(infinite_iterator))
输出
1 2 3 4 5
这里,我们创建了一个无限迭代器,它从 1 开始,每次递增 1。
然后我们使用 for
循环和 next()
方法打印了无限迭代器的前 5 个元素。