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

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

本文深入解析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 相关产品和应用

全部下载

专题列表