Python 3 生成器表达式

Python 3 generator expression

def gen_letters(s,l):
    def __gen(s,l):
    if l > 1:
        for c in 'abcdefghijklmnopqrstuvwxyz ':
            __gen(s+c,l-1)
    else:
        print(1)
        for c in 'abcdefghijklmnopqrstuvwxyz ':
            yield s+c
    return __gen(s,l)

我正在尝试生成字母表中长度为“l”的所有字母组合。此函数的预期用途是:

combos = gen_letters('', 10)

第二个参数是 return 的组合长度。 例如,如果我想从字母表和 space 生成所有可能的 3 个字符长度的字符串,我应该得到 19683 种组合。当尝试使用“next(combos)”或“for combo in combos:”时(甚至在第一个 next() 上)我收到此错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

非常感谢帮助:)

不需要嵌套函数,您的基本情况可以更简单:

def gen_letters(l):
    if not l:
        yield ""
    else:
        for c in 'abcdefghijklmnopqrstuvwxyz ':
            for combo in gen_letters(l-1):
                yield c + combo


    
[*gen_letters(2)]
# ['aa', 'ab', ..., ' x', ' y', ' z', '  ']

或者,更接近你的原作:

def gen_letters(s,l):
    if l:
        for c in 'abcdefghijklmnopqrstuvwxyz ':
            yield from gen_letters(s+c,l-1)
    else:
        yield s

[*gen_letters('', 2)]
# ['aa', 'ab', ..., ' x', ' y', ' z', '  ']

注意 yield from 行。这是您进行了正确的递归调用,但未对结果执行任何操作的地方。