您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – yield和return的结果不同

5b51 2022/1/14 8:21:27 python 字数 4244 阅读 486 来源 www.jb51.cc/python

我真的不明白屈服声明在这种情况下是如何运作的.问题是,给定一个没有括号的表达式,编写一个函数来生成所有可能的完全括号(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)我的代码如下.OP

概述

我真的不明白屈服声明在这种情况下是如何运作的.问题是,给定一个没有括号的表达式,编写一个函数生成所有可能的完全括号(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.

我终于想出通过注释第一行,第二行G = f(第一),第二行(第二行)并替换行来使代码工作的方法

对于e'(‘(‘e1 op e2’)’对于eG in firstG for e2 in secondG):

通过

for e in(‘(‘e1 op e2’)’for f1 in f(first)in e2 in f(second)):

这意味着由于行firstG,secondG = f(第一个),f(秒),生成器的某些“信息”丢失了,但我无法弄清楚真正的原因.你们能给我一些想法吗?

firstG,list(f(second))

或者,您可以更改循环:

for e in ("(%s%s%s)" % (e1,op,e2) for e1 in f(first) for e2 in f(second)):
#                               new generator object every loop  ^^^^^^^^^

非收益版本的工作原理是因为您返回列表,与生成器不同,列表可以重复迭代.另请注意,您只需迭代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

总结

以上是编程之家为你收集整理的python – yield和return的结果不同全部内容,希望文章能够帮你解决python – yield和return的结果不同所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶