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