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

