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
相关产品推荐
相关产品推荐

