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

Python报错SyntaxError: 'yield' outside of function 解决方法

报错根因

yield是Python生成器的专属关键字,仅允许出现在函数定义内部,直接在全局作用域的循环中写yield,无论怎么调整缩进都会触发SyntaxError: 'yield' outside of function报错,和缩进格式无关。

你参考的社区回答贴出的是网格生成的核心逻辑片段,不是可直接运行的完整代码,片段省略了外层的生成器函数包装,并非代码本身错误。
另外你当前代码还有一个隐藏问题:Python原生range()函数的步长参数仅支持整数类型,传入0.001这类浮点值会触发TypeError: 'float' object cannot be interpreted as an integer,运行时也会报错。

可运行修正代码

方案1:保留yield生成器写法(适合大尺寸网格,内存占用低)

把网格生成逻辑包装到函数内,同时替换支持浮点步长的方法实现坐标遍历:

import numpy as np

def generate_grid(stepsize=0.001):
    for x in np.arange(0, 10, stepsize):
        for y in np.arange(0, 10, stepsize):
            yield (x, y)

# 调用示例
if __name__ == "__main__":
    grid_generator = generate_grid()
    # 遍历时才会逐个生成坐标点
    # for point in grid_generator:
    #     编写绘制坐标点的业务逻辑

如果不想引入numpy依赖,也可以通过整数缩放的方式实现浮点步长遍历,避免额外依赖:

def generate_grid(stepsize=0.001):
    scale = int(1 / stepsize)
    max_val = int(10 * scale)
    for x in range(0, max_val, 1):
        for y in range(0, max_val, 1):
            yield (x / scale, y / scale)

方案2:不需要惰性迭代时的普通写法

如果网格尺寸不大,不需要生成器的低内存特性,可以直接生成坐标列表,完全不用yield:

stepsize = 0.001
grid_points = []
scale = int(1 / stepsize)
max_val = int(10 * scale)
for x in range(0, max_val, 1):
    for y in range(0, max_val, 1):
        grid_points.append((x / scale, y / scale))
注意事项
  • 技术问答社区的回答经常只贴核心逻辑片段,不会每次都给出包含函数定义、依赖导入、边界处理的完整可运行代码,参考时需要结合语法规则补全外层结构。
  • 带yield的函数调用后不会立刻执行内部逻辑,会返回一个生成器对象,只有对这个对象做迭代操作时,才会逐段运行内部代码产出值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:42:13