收益率与收益率的不同结果

2024-10-02 08:14:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我真的不明白yield语句在这种情况下是如何工作的。问题是给定一个没有括号的表达式,编写一个函数来生成所有可能的全括号(FP)表达式。例如,输入是'1+2+3+4',应该生成5个FP表达式:

  1. (1+(2+(3+4)))
  2. (1+((2+3+4))
  3. ((1+2+(3+4))
  4. ((1+(2+3))+4)
  5. ((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)行而丢失,但我无法找出真正的原因。你们能给我一些建议吗?在


Tags: 代码infor表达式语句firstsecondyield
1条回答
网友
1楼 · 发布于 2024-10-02 08:14:32

问题是在yield版本中迭代生成器而不是列表,特别是在一个循环后耗尽的secondG。将行改为这个,它就可以工作了:

firstG, secondG = f(first), list(f(second))

或者,您可以更改循环:

^{pr2}$

非yield版本之所以能工作,是因为您返回了列表,而列表可以重复使用,这与生成器不同。还请注意,您只在firstG上迭代一次,因此它不会受到影响。在

请记住:

r = [v for a in A for b in B]

相当于:

r = []
for a in A:
  for b in B:
    r.append(v)

它更清楚地显示了B上的重复循环。在

另一个例子:

def y():
  yield 1
  yield 2
  yield 3
def r():
  return [1, 2, 3]

vy = y()
for v in vy:
  print v
for v in vy:
  print v

print " -"

vr = r()
for v in vr:
  print v
for v in vr:
  print v

相关问题 更多 >

    热门问题