python:将boolean和string一起返回的错误

时间:2014-09-20 19:14:41

标签: python return

我在python中正在编写这个编程问题而且我遇到了一些问题。 问题:取一串数字并将其拆分,插入*和+运算符(或连接一些数字),以便生成的表达式求值为给定数字。如果没有解决方案,请打印“未找到解决方案。

解决方案1:

def findResult(s, goal):

    i = 1
    gg = False
    while gg ==False and i < len(s)+1:
        if int(s) == goal:
            gg = True
            return True

        num = int(s[0:i])
        if goal % num == 0:
            gg = findResult(s[i:len(s)], goal / num) or findResult(s[i:len(s)], goal - num)
        else:
            gg = findResult(s[i:len(s)], goal - num)
        i += 1

    return gg

ss = '12345'
goal = 691
print findResult(ss, goal)

当我测试这段代码时,它会判断字符串是否可以计算到目标号码(True或False)。然后我想返回计算进度(1 + 2 * 345)。我改变了我的代码:

解决方案2:

def findResult(s, goal, prog):
    i = 1
    gg = False
    while gg ==False and i < len(s)+1:

        if int(s) == goal:
            gg = True
            prog += s
            return (True,prog)
        else:
            num = int(s[0:i])
            if goal%num == 0:
                gg,prog = findResult(s[i:len(s)], goal / num,prog+"*"+str(num)) or findResult(s[i:len(s)], goal - num,prog+"+"+str(num))
            else:
                gg,prog = findResult(s[i:len(s)], goal - num,prog+"+"+str(num))
        i += 1

    return (gg,prog)

ss = '12345'
goal = 691
print findResult(ss, goal,"")

此代码的输出错误。而我无法理解的是,“gg”也从“True”变为“False”。谁能告诉我我的错误在哪里?如果可能的话,你能告诉我打印进度字符串的方法吗?更重要的是,我的编程风格可能并不清楚。如果您有任何建议,我很高兴听到!谢谢!

3 个答案:

答案 0 :(得分:1)

您的版本依赖于findResult()返回的返回值只需布尔值:

gg,prog = findResult(s[i:len(s)], goal / num,prog+"*"+str(num)) or findResult(s[i:len(s)], goal - num,prog+"+"+str(num))

注意该表达式中的or; (False, somestring)(True, somestring) 始终为True !这是因为非空元组总是被认为是真的。

你需要将其拆分出来:

if goal%num == 0:
    gg,prog = findResult(s[i:len(s)], goal / num,prog+"*"+str(num))
    if not gg:
        gg, prog = findResult(s[i:len(s)], goal - num,prog+"+"+str(num))

请注意,使用gg == False测试错误值不会被视为Pythonic。请改用not gg

答案 1 :(得分:1)

我认为问题出在这一行:

gg,prog = findResult(s[i:len(s)], goal / num,prog+"*"+str(num)) or findResult(s[i:len(s)], goal - num,prog+"+"+str(num))

在这里,您在元组上使用or运算符。但是,非空元组总是在布尔上下文中求值为True。你应该写这样的东西:

gg,prog = findResult(s[i:len(s)], goal / num,prog+"*"+str(num))
if gg == False:
    gg,prog = findResult(s[i:len(s)], goal - num,prog+"+"+str(num))

答案 2 :(得分:0)

感谢abacabadabacaba和Martijn Pieters!我让我的代码工作了。我的代码现在是:

def findResult(s, goal, prog):
    i = 1
    gg = False
    while gg ==False and i < len(s)+1:

        if int(s) == goal:
            gg = True
            prog += s
            return (True,prog)

        num = int(s[0:i])
        if goal%num == 0:
            gg,prog = findResult(s[i:len(s)], goal / num,prog+str(num)+"*") 
            if gg == False:
                gg,prog =findResult(s[i:len(s)], goal - num,prog+str(num)+"+")
        else:
            gg,prog = findResult(s[i:len(s)], goal - num,prog+str(num)+"+")
        i += 1
    if gg == True:
        return (gg,prog)
    else:
        return (gg,"")

ss = '12345'
goal = 691
gg,result = findResult(ss, goal,"")
result += "=" + str(goal)
print result if gg else "No solution"

谢谢你们!