ZetCode

Python next 函数

上次修改时间:2025 年 4 月 11 日

这份全面指南探讨了 Python 的 next 函数,该函数用于从迭代器中检索下一个项目。我们将涵盖基本用法、迭代协议、生成器以及手动迭代控制的实际示例。

基本定义

next 函数通过调用迭代器的 __next__ 方法来检索迭代器中的下一个项目。它是 Python 迭代协议的基础,适用于所有可迭代对象。

主要特征:耗尽时引发 StopIteration,接受一个默认值来代替返回,并在 for 循环中隐式使用。它在每次调用时都会推进迭代器状态。

基本迭代器用法

以下是使用不同可迭代类型的简单用法,展示了 next 如何一次从各种迭代器中检索项目。

basic_next.py
# With list iterator
numbers = [1, 2, 3]
iter_numbers = iter(numbers)
print(next(iter_numbers))  # 1
print(next(iter_numbers))  # 2
print(next(iter_numbers))  # 3

# With string iterator
text = "abc"
iter_text = iter(text)
print(next(iter_text))     # 'a'

此示例展示了 next 如何与不同的迭代器一起使用。每次调用都会按顺序检索下一个项目。 迭代器会记住其位置。

请注意,在使用 next 之前,我们首先使用 iter() 创建一个迭代器对象。这是所有内置可迭代对象所必需的。

默认值处理

next 可以接受一个默认值来代替引发 StopIteration 返回。 此示例演示了优雅的处理方式。

default_next.py
colors = ['red', 'green', 'blue']
iter_colors = iter(colors)

print(next(iter_colors, 'end'))  # 'red'
print(next(iter_colors, 'end'))  # 'green'
print(next(iter_colors, 'end'))  # 'blue'
print(next(iter_colors, 'end'))  # 'end' (default returned)
print(next(iter_colors, 'end'))  # 'end' (default returned)

当迭代器耗尽时,next 的第二个参数指定一个默认值。 这可以防止 StopIteration 异常。

当您需要在没有 try/except 块的情况下处理迭代结束时,此模式非常有用,尤其是在循环或生成器表达式中。

生成器函数

生成器是 next 的常见用例。 此示例显示了对生成器函数的手动迭代控制。

generator_next.py
def count_up_to(max):
    count = 1
    while count <= max:
        yield count
        count += 1

counter = count_up_to(3)
print(next(counter))  # 1
print(next(counter))  # 2
print(next(counter))  # 3
print(next(counter, "Done"))  # "Done"

生成器函数 count_up_to 产生值直到达到其最大值。 每次 next 调用都会恢复执行,直到下一个 yield

生成器在调用之间维护其本地状态,使其对于大型或无限序列具有内存效率。

自定义迭代器类

您可以通过实现迭代器协议来创建自定义迭代器。 此示例显示了一个带有 __next__ 方法的类。

custom_next.py
class SquareNumbers:
    def __init__(self, max):
        self.max = max
        self.current = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current >= self.max:
            raise StopIteration
        self.current += 1
        return self.current ** 2

squares = SquareNumbers(3)
print(next(squares))  # 1
print(next(squares))  # 4
print(next(squares))  # 9
print(next(squares, "No more squares"))  # "No more squares"

SquareNumbers 类同时实现了 __iter____next__,使其成为一个合适的迭代器。 每次调用 next 都会调用 __next__

此模式可以完全控制迭代行为,并且对于创建自定义类序列对象非常有用。

错误处理

此示例演示了在使用 next 与可能已耗尽的迭代器时,如何正确处理错误。

error_handling.py
data = ['a', 'b']
iter_data = iter(data)

try:
    print(next(iter_data))  # 'a'
    print(next(iter_data))  # 'b'
    print(next(iter_data))  # Raises StopIteration
except StopIteration:
    print("Reached end of iteration")

# Alternative with default value
iter_data = iter(data)
print(next(iter_data, None))  # 'a'
print(next(iter_data, None))  # 'b'
print(next(iter_data, None))  # None

第一种方法使用 try/except 来捕获 StopIteration,当迭代器没有更多项目时会引发该异常。 第二种方法使用默认值。

根据到达末尾是预期情况(使用默认值)还是异常情况(使用 try/except)来选择这些方法。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程