【问题标题】:Python 3 generator expressionPython 3 生成器表达式
【发布时间】:2021-12-27 10:01:11
【问题描述】:
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)

第二个参数是要返回的组合的长度。 例如,如果我想从字母表和空格中生成所有可能的 3 个字符长度的字符串,我应该得到 19683 个组合。当尝试使用“next(combos)”或“for combo in combos:”时(即使在第一个 next())我得到这个错误:

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

非常感谢您的帮助:)

【问题讨论】:

  • 好吧,l &gt; 1 是真的,所以你执行了那个分支,这个分支没有任何结果。我认为您的意思是在递归调用中写 yield from __gen(...)
  • 这能回答你的问题吗? Can generators be recursive?

标签: python-3.x generator yield


【解决方案1】:

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

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 行。这是您进行了正确的递归调用,但没有对结果执行任何操作的地方。

【讨论】:

  • 使用yield from 通常比在其中编写带有yield 的循环更有效。
  • 没错,虽然这很少是瓶颈。更简洁的代码和更简单的签名也有很大的优点
猜你喜欢
  • 2017-12-08
  • 2014-04-02
  • 2021-10-17
  • 2021-04-26
  • 2012-08-20
  • 2011-01-01
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多