Python生成器next和send方法的区别详解

周末不加班
周末不加班
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Python生成器中next()与send()方法的核心区别。通过对比两者在控制执行流、返回值传递及参数注入方面的不同机制,结合具体代码示例,阐明next()仅用于推进迭代,而send()可向前生成器发送值以覆盖yield表达式的结果,帮助开发者更灵活地控制生成器状态。

Python生成器next与send方法区别解析

yield关键字在Python中具有特定的语法规则,它不仅是生成器函数的标志,还决定了函数执行的暂停与恢复机制。

当生成器执行到yield语句时,函数会立即暂停执行,并返回yield后表达式的计算结果(若未指定表达式,则默认返回None)。此时,生成器保存当前的局部变量和执行状态。后续若再次调用next()方法,生成器将从上次暂停的yield语句处继续向下执行,直到遇到下一个yield或函数结束。当生成器无法继续迭代时,会抛出StopIteration异常,该异常通常由for循环自动捕获并处理。

def fib(n):


def fib(n):
  a, b = 0, 1
  i = 0
  while i < n:
    yield b
    a, b = b, a+b
    i += 1

if __name__ == '__main__':
  f = fib(10)
  for item in f:
    print(item)

在Python中,包含yield关键字的函数被称为生成器函数,调用该函数会返回一个生成器对象。每次调用next()方法时,生成器会执行代码直到遇到yield语句,然后返回yield后代码块的执行结果,并暂停执行。


def foo():
  bar_a = yield 1     # bar_a是语句块(yield 1)的返回值,默认为None
  bar_b = yield bar_a
  yield "最后一个值,再迭代就要报StopIteration了"

f = foo()          # 创建生成器,此时没有执行foo()里的任何语句
print(next(f))       # 从foo()里进入,一直执行到(yield 1)处,此时变量bar_a还没有创建
print(next(f))       # 先将语句块(yield 1)的返回值赋值个bar_a,此时bar_a的值是None。
              # 然后执行到语句块(yield bar_a),bar_b也还没有被创建
print(next(f)

>>>1
>>>None
>>>最后一个值,再迭代就要报StopIteration了

send()方法


def foo():
  bar_a = yield 1
  bar_b = yield bar_a
  yield "最后一个值,再迭代就要报StopIteration了"

f = foo()
print(f.send(None))    # 和next(f)的效果一模一样
print(f.send("my lover")) # 覆盖yield 1语句的返回值
print(next(f))

>>>1
>>>my lover
>>>最后一个值,再迭代就要报StopIteration了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。