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

Python生成指定长度字母空格组合的generator抛出StopIteration如何解决

错误原因分析
  • 缩进不规范:内部函数__gen的逻辑代码没有正确缩进,if l > 1及后续分支应当位于__gen的函数作用域内,需要多一级缩进。
  • 递归调用未透传生成结果:生成器函数递归调用自身时,仅执行__gen(s+c,l-1)只会创建一个新的生成器对象,不会自动迭代它产出值。当输入的l>1时,你的代码没有任何yield语句执行,生成器会直接结束,所以第一次调用next()就会抛出StopIteration。
修复方案

Python 3.3及以上版本可以使用yield from语法,直接将递归生成的所有结果透传给上层调用者,同时修正缩进问题即可。修复后的代码如下:

def gen_letters(s, l):
    def __gen(s, l):
        if l > 1:
            for c in 'abcdefghijklmnopqrstuvwxyz ':
                # 透传递归生成的所有字符串
                yield from __gen(s + c, l - 1)
        else:
            for c in 'abcdefghijklmnopqrstuvwxyz ':
                yield s + c
    return __gen(s, l)

如果需要兼容更早的Python版本,可以手动迭代递归生成的生成器对象,逐个yield结果:

def gen_letters(s, l):
    def __gen(s, l):
        if l > 1:
            for c in 'abcdefghijklmnopqrstuvwxyz ':
                for sub_str in __gen(s + c, l - 1):
                    yield sub_str
        else:
            for c in 'abcdefghijklmnopqrstuvwxyz ':
                yield s + c
    return __gen(s, l)
效果验证

测试3位长度的组合数,符合你提到的19683的预期:

combos = gen_letters('', 3)
print(len(list(combos)))  # 输出 19683

如果不需要调试打印,原代码中的print(1)可以直接删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:27:03