python yield和return的区别_python – yield和return的结果不同

我真的不明白屈服声明在这种情况下是如何运作的.问题是,给定一个没有括号的表达式,编写一个函数来生成所有可能的完全括号(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(秒),生成器的某些“信息”丢失了,但我无法弄清楚真正的原因.你们能给我一些想法吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值