You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中无参数yield返回什么?其工作机制是怎样的?

关于Python中无参数yield的工作原理

嘿,这个问题问到点子上了,刚好能理清yield两个容易混淆的核心点——它产出的值和它作为表达式的返回值。咱们一步步拆解:

1. 无参数yield会产出什么?

当你在生成器函数里写不带参数的yield(比如直接写yield,不是yield some_value),当你通过next()或者for循环迭代生成器时,它会产出None。举个直观的例子:

def sample_gen():
    yield  # 无参数yield
    yield "带参数的yield"

gen = sample_gen()
print(next(gen))  # 输出: None
print(next(gen))  # 输出: 带参数的yield

第一次调用next()时,生成器碰到无参数yield,就把None抛出来并暂停;第二次碰到带参数的yield,就产出指定的字符串。本质上,无参数yield就是yield None的简写。

2. 无参数yield作为表达式时返回什么?

这里是很多人容易搞混的地方:yield本身是个表达式,它的返回值是你通过生成器的send()方法发送给它的值——不管yield有没有参数都是如此。

比如这个用无参数yield接收外部值的例子:

def receiver_gen():
    print("准备接收第一个值...")
    received = yield  # 无参数yield,这里会接收send过来的值
    print(f"收到第一个值: {received}")
    # 这里yield带参数,同时也能接收下一个send的值
    another_received = yield "我要产出这个值啦"
    print(f"收到第二个值: {another_received}")

gen = receiver_gen()
# 第一次调用next(),启动生成器到第一个yield的位置
next(gen)  # 输出: 准备接收第一个值...
# 用send()发送值,此时yield表达式的返回值就是"Hello Generator"
response = gen.send("Hello Generator")  # 输出: 收到第一个值: Hello Generator
print(f"生成器产出的值: {response}")  # 输出: 生成器产出的值: 我要产出这个值啦
# 再发送一个值
gen.send("Another Message")  # 输出: 收到第二个值: Another Message

注意:生成器刚创建时不能直接send()非None值,必须先用next()或者send(None)启动它,让它走到第一个yield的位置,才能正常发送值。

一句话总结

  • 迭代生成器时,无参数yield产出None;
  • 用send()给生成器传值时,无参数yield作为表达式的返回值就是你传入的那个值;
  • 它的工作逻辑和带参数的yield完全一致,只是默认产出None而已。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:15:53