Python __iter__() 和 __next__() - 将对象转换为迭代器

2025年1月5日 | 阅读6分钟

我们经常需要访问一个对象,比如一个迭代器。创建生成器循环是一种方法,但它需要程序员花费更多的时间和精力。Python 通过包含一个名为 __iter__() 的内置函数使这项工作更加容易。在这篇文章中,我们将学习 Python 的 __iter__() 和 __next__()。

Python __iter__()

Python 的 __iter__() 方法为提供的对象生成一个迭代器,该对象可以是数组、集合、元组或自定义对象。Python 中的 __next__() 构建了一个可以一次访问一个元素的 cont,这在处理循环时很有用。

语法

  • 对象: 为其构建迭代器的对象。它可以是用户定义的 cont (OOPS) 或列表或元组等集合 cont。
  • Callable, Sentinel: Sentinel 值表示正在迭代的序列的结束,而 callable 代表一个可调用 cont。Sentinel 值还表示必须停止迭代的值。

Exception

Python 的 __iter__() 函数生成一个迭代器 cont,该 cont 遍历提供的对象的每个成员。在 Python 中,__next__() 提供对下一个元素的访问。迭代继续,直到找到值或到达可调用 cont 和 sentinel 值的情况下的元素末尾。无论如何,原始 cont 都不会发生任何改变。

在此示例中,我们正在通过使用 iter 和 next 函数遍历列表并打印下一行中的下一个成员。

程序说明

此 Python 代码演示了如何使用 next() 方法循环遍历列表的成员,以及如何使用 iter() 函数创建迭代器。以下描述了代码的每个部分

  • 使用公式 listA = ['a', 'e', 'i', 'o', 'u'] 初始化一个元音列表。
  • iter_listA = iter(listA): 使用 iter() 函数从列表中创建迭代器。
  • 通过 try 块处理潜在的异常。
  • 在 attempt 块内

next(iter_listA): 要获取迭代器的后续元素,请调用 next() 方法。

为了按顺序恢复每个元音,这会执行多次。

  • 当迭代器没有更多元素时引发的 StopIteration 异常由 unless 块捕获。

此代码演示了如何检索迭代器中的条目,直到列表末尾触发 StopIteration 异常。此异常由 except 块处理,该块允许无错误的代码执行。

输出

a
e
i
o
u

Python __next__()

Python 函数 __next__() 返回迭代的下一个元素。如果没有更多项,则会引发 StopIteration 异常。它是可迭代和迭代器接口的特性。它允许我们设计独特的类迭代 cont,如生成器,并一次管理从这些可迭代 cont 中提取每个元素的过程。

在此示例中,我们使用 Python 的 __next__() 方法循环遍历列表并输出下一个条目。

程序说明

这段简短的 Python 代码说明了如何从列表中生成迭代器并使用 while 循环遍历其成员,以及如何使用 iter() 函数和 __next__() 方法。使用 iter_lst.__next__(),try 块尝试从迭代器中获取下一个元素;如果成功,它会输出该元素。当触发 StopIteration 异常时,unless 块退出循环,这会使循环保持运行。此示例演示了如何使用 iter() 方法和迭代器接口手动遍历列表的元素。

输出

111
222
333
444
555

在此示例中,我们使用 Python 中的 __next__() 来显示如果不存在下一个元素而产生的异常。

程序说明

提供的 Python 代码段以基本术语展示了如何在列表上使用迭代器方法和 iter() 函数。它使用 __iter__() 函数获取迭代器 (iter_listB) 并初始化一个名为 list 的字符串列表。然后通过反复调用 __next__() 函数从迭代器中检索后续元素。Try-except 块用于捕获 StopIteration 错误,当尝试访问的元素超过列表包含的元素时会发生这些错误。到达列表末尾后,程序会发布每个元素,直到处理完异常,并生成一条消息,宣布迭代结束,并附带一条关于 'StopIterationError' 的注释。

输出

Rat
Hat
Fat
Bat
Throwing 'StopIterationError,' I cannot count more.

用户定义的 cont (使用 OOPS)

在此示例中,我们通过实现 __iter__() 和 __next__() 过程来演示使用 Python 中的 OOPS 利用 iter()。

程序说明

提供的 Python 代码创建了一个 Counter 类,该类为给定的数字范围实现了基本的迭代器。该类接受的两个参数是 start 和 end,它们代表范围的包含式开始和结束值。__iter__ 方法返回迭代器 cont(本身),而 __init__ 方法使用提供的这些值初始化计数器。当达到范围末尾时,__next__ 方法会引发 StopIteration 异常并生成范围内的下一个值。

驱动代码创建了 Counter 类的两个实例 c1 和 c2,它们具有相同的开始和结束值。代码的第一部分演示了如何使用 cont (c1) 上的 for 循环遍历范围。第二部分显示了另一种使用 while 循环手动遍历范围的技术,该技术利用了 iter() 和 next() 方法 (c2)。当达到范围时,软件会产生一条自定义消息,表明游戏因过度沉迷于披萨而结束。此外,它会产生通知,表明正在消耗多少披萨。

输出

Print the range without iter()
Eating more Pizzas, counting  2
Eating more Pizzas, counting  3
Eating more Pizzas, counting  4
Eating more Pizzas, counting  5

Print the range using iter()

Eating more Pizzas, counting  2
Eating more Pizzas, counting  3
Eating more Pizzas, counting  4
Eating more Pizzas, counting  5

Dead on overfood, GAME OVER

下一个主题Python 3 基础