【问题标题】:Python - else statement is never triggeredPython - else 语句永远不会被触发
【发布时间】:2017-11-20 17:08:58
【问题描述】:

我希望这是一个重复的问题,但我找不到答案。对不起。

我编写了一个简单的函数,它应该返回一个空字符串或一个字符的字符串。但是,有时它会返回 None。 即使它应该匹配其中一个操作数,并且如果不匹配,仍会输出一个字符串。

baseconvert = digits+ascii_lowercase+"0"
def checker(operand, factorlist): # hardcoded interpreter of the calculus converted in base 10. i is equal to the base.
    if (operand == '+'):
        if (factorlist[0] + factorlist[1] == factorlist[2]):
            return baseconvert[i]
    elif (operand == '-'):
        if (factorlist[0] - factorlist[1] == factorlist[2]):
            return baseconvert[i]
    elif (operand == '*'):
        if (factorlist[0] * factorlist[1] == factorlist[2]):
            return baseconvert[i]
    elif (operand == '/'):
        if (factorlist[0] / factorlist[1] == factorlist[2]):
            return baseconvert[i]
    else:
        return ""

所以在输入这篇文章时,我发现我可以删除 else 语句:

    # else: is not necessary
    return ""

工作正常。但是,我仍然想知道为什么永远不会触发这个 else 语句。

P.S.:有没有更简洁的方法来解释字符串,例如 "10 - 7 = 3" 以获得布尔结果?我对 python 比较陌生,什么都想不出来。

编辑:

以下代码,参数脱离上下文,打印无:

from string import digits, ascii_lowercase
baseconvert = digits+ascii_lowercase+"0"

def checker(operand, factorlist): # hardcoded interpreter of the calculus converted in base 10. i is equal to the base.
    if (operand == '+'):
        if (factorlist[0] + factorlist[1] == factorlist[2]):
            return baseconvert[i]
    elif (operand == '-'):
        if (factorlist[0] - factorlist[1] == factorlist[2]):
            return baseconvert[i]
    elif (operand == '*'):
        if (factorlist[0] * factorlist[1] == factorlist[2]):
            return baseconvert[i]
    elif (operand == '/'):
        if (factorlist[0] / factorlist[1] == factorlist[2]):
            return baseconvert[i]
    else:
        return ""
i=17
print(checker('+', [1987,222,2227]))

预期结果:

  • if (operand == "+") 是真的。
  • if (factorlist[0] + factorlist[1] == factorlist[2]) 为假。
  • 调用第 15 行的else:。
  • “”返回。

我仍然想知道为什么没有显示我预期的这种行为,但没关系。仅使用一个 return 语句以及不使用 else: 是很好的解决方案。

我还发现了以下作品,这与我想要完成的工作最接近:

def checker(operand, factorlist): # hardcoded interpreter of the calculus converted in base 10. i is equal to the base.
    if ((operand == '+') & (factorlist[0] + factorlist[1] == factorlist[2])):
            return baseconvert[i]
    elif ((operand == '-') & (factorlist[0] - factorlist[1] == factorlist[2])):
            return baseconvert[i]
    elif ((operand == '*') & (factorlist[0] * factorlist[1] == factorlist[2])):
            return baseconvert[i]
    elif ((operand == '/') & (factorlist[0] / factorlist[1] == factorlist[2])):
            return baseconvert[i]
    else:
        return ""

我已经多次为所有解决方案计时,这个最终解决方案似乎比拆分 if 语句和使用一个返回的变量快 15%。

【问题讨论】:

  • 你说的这个else语句永远不会触发是什么意思,因为如果操作数不是有效的运算符就会被触发。
  • 请添加一个示例,说明您如何调用该函数以及为什么它的行为不像您希望的那样。
  • 您的函数有时返回None 的原因是因为您并不总能找到导致return 的条件。当它在没有return 的情况下从您的外部if 中退出时,它将直接落入函数末尾并给出默认返回值。
  • &在python中不是逻辑运算符,它是二元运算符。你的意思可能是and。

标签: python python-3.x if-statement


【解决方案1】:

你有 if 子句嵌套在你的父 if...elif 中,当控制没有流出这些子句时,它不会返回到父 else (即如果函数没有通过任何嵌套的 ifs,执行在函数结束时完成)。您应该在函数末尾添加一个 return 以正确处理此问题并避免返回默认的 None:

def checker(operand, factorlist):
    if operand == '+':
        if (factorlist[0] + factorlist[1] == factorlist[2]):
            ...
    elif operand == '-':
        if (factorlist[0] - factorlist[1] == factorlist[2]):
            ...
    elif operand == '*':
        if (factorlist[0] * factorlist[1] == factorlist[2]):
            ...
    elif operand == '/':
        if (factorlist[0] / factorlist[1] == factorlist[2]):
            ...

    return ""

您还可以安全地删除最终的 else,因为最终的返回值在您的函数中充当全局返回默认值。

【讨论】:

  • when control does not flow out of those, it does not return to the parent else. 但是,如果我像我一样在每个 if 中都有一个 return 语句,这有关系吗?我只需要通过返回一个字符来终止函数。
【解决方案2】:

这是主观的,但很多人会说在一个函数中只有一个return。在这种情况下,可以提供帮助。问题是,如果另一个条件为 True,您只能从每个 elif 返回。可以这样重构:

baseconvert = digits+ascii_lowercase+"0"
def checker(operand, factorlist):
    # hardcoded interpreter of the calculus converted in base 10. i is equal to the base.
    final_value = ""
    if operand == '+':
        if factorlist[0] + factorlist[1] == factorlist[2]:
            final_value = baseconvert[i]
    elif operand == '-':
        if factorlist[0] - factorlist[1] == factorlist[2]:
            final_value = baseconvert[i]
    elif operand == '*':
        if factorlist[0] * factorlist[1] == factorlist[2]:
            final_value = baseconvert[i]
    elif operand == '/':
        if factorlist[0] / factorlist[1] == factorlist[2]:
            final_value = baseconvert[i]

    return final_value

请注意,您只需要在 python 中的条件周围加上括号作为优先级,大多数情况下它们不是必需的。

【讨论】:

  • 什么会更好?要在 if 语句中写入变量并在函数底部返回 this,还是像我现在尝试的那样在每个 if 块中返回?
  • “更好”是主观的。我个人更喜欢我展示的方式,即使用一个变量并且只有一个return。最初可能需要做更多的工作,但它可以使调试和维护更容易,尤其是在您需要跟踪返回值的情况下。但是,如果使用这种模式会让你越过障碍,那就不要使用它 - 我认为它通常更好,但也可能有例外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多