【发布时间】:2011-01-03 11:34:30
【问题描述】:
我真的不明白yield 语句在这种情况下是如何工作的。问题是给定一个没有括号的表达式,编写一个函数来生成所有可能的全括号(FP)表达式。比如说,输入是'1+2+3+4',应该生成5个FP表达式:
- (1+(2+(3+4)))
- (1+((2+3)+4))
- ((1+2)+(3+4))
- ((1+(2+3))+4)
- (((1+2)+3)+4)
我的代码如下。
OPS = ('+', '-', '*', '/')
def f(expr):
"""
Generates FP exprs
Recursive formula: f(expr1[op]expr2) = (f(expr1) [op] f(expr2))
"""
if expr.isdigit(): yield expr
# return [expr]
# ret = []
first = ''
i = 0
while i < len(expr):
if expr[i] not in OPS:
first += expr[i]
i += 1
else:
op = expr[i]
i += 1
second = expr[i:]
firstG, secondG = f(first), f(second)
for e in ('(' + e1 + op + e2 + ')' for e1 in firstG for e2 in secondG):
yield e
# ret.append(e)
first += op
# return ret
如果我使用return 语句(注释掉的行),那么代码将按预期工作。但是,当我按照代码所示更改为 yield 语句时,我只得到前 4 个结果。如果输入表达式的操作数增加,那么当然会丢失更多的结果。例如,对于输入 '1+2+3+4+5',我只得到 8 而不是 14。
我终于弄清楚了通过注释掉firstG, secondG = f(first), f(second)这一行并替换该行来使代码工作的方法
for e in ('(' + e1 + op + e2 + ')' for e1 in firstG for e2 in secondG):
通过
for e in ('(' + e1 + op + e2 + ')' for e1 in f(first) for e2 in f(second)):
这意味着由于firstG, secondG = f(first), f(second) 行而丢失了生成器的一些“信息”,但我无法弄清楚真正的原因。大家能给我一些意见吗?
【问题讨论】:
-
请编辑问题并修正程序的缩进。在 Python 程序中,错误的缩进尤其令人讨厌。
-
对不起,这是因为我不熟悉标签代码在这里的工作方式。我已经修好了。谢谢
-
把它标记为作业,因为我的印象是。
-
我认为问题可能出在调用它的代码中,你能告诉我们你是如何使用它的吗?