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

PEP 342允许的yield表达式运行报错,是否已不再被Python支持?

问题解答

这些语法并没有被Python废弃,你遇到的SyntaxError: 'yield' outside function报错,是因为你直接在全局作用域执行了这些代码,yield是生成器专属语法,只能在函数内部使用,只要把代码放到包含yield的生成器函数中,所有Python 2.5+以及全部Python 3版本都可以正常运行。

原本的运行行为

yield作为表达式的核心作用是:暂停生成器函数的执行,将指定值返回给调用方,同时可以接收调用方通过send()方法传入的数值,恢复执行后将传入值作为yield表达式的返回值参与后续运算。
你列出的几个合法写法的具体行为如下:

  • x = yield 42:生成器运行到此处时,先向调用方返回42并暂停执行;后续调用方调用send(xxx)时,将传入的xxx赋值给x,再继续执行后续代码
  • x = yield:逻辑同上,只是不会向调用方返回有效值,调用方拿到的返回值为None,传入值依然会赋值给x
  • x = 12 + (yield 42):先向调用方返回42并暂停,拿到传入值后,将传入值加12赋值给x。这里yield必须加括号,因为它不是赋值语句右侧的顶层表达式,属于加法运算的子表达式,符合PEP 342的语法约束
  • x = 12 + (yield):逻辑同上,返回给调用方的值为None,传入值加12后赋值给x
  • foo(yield 42):先向调用方返回42并暂停,拿到传入值后,将传入值作为参数调用foo函数
  • foo(yield):逻辑同上,返回给调用方的值为None,传入值作为参数调用foo函数

可运行示例

def test_gen():
    x = yield 42
    print(f"x的赋值结果:{x}")
    y = 12 + (yield 100)
    print(f"y的赋值结果:{y}")

# 实例化生成器
g = test_gen()
# 第一次调用next启动生成器,执行到第一个yield,拿到返回值42
print(next(g)) 
# 输出:42

# 向第一个yield传值20,x被赋值为20,执行到第二个yield,拿到返回值100
print(g.send(20))
# 输出:x的赋值结果:20
# 输出:100

# 向第二个yield传值30,计算y=12+30=42,打印后生成器执行结束
g.send(30)
# 输出:y的赋值结果:42
# 随后抛出StopIteration异常,属于生成器正常结束的标志

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:54:06