为什么"if-else-break"在python中中断?



我正在尝试使用 if-else 表达式,如果if条件失败,它应该中断循环,但出现invalid syntax错误。

示例代码:

a = 5
while True:
    print(a) if a > 0 else break
    a-=1

当然,如果我以传统方式(不使用一行(写作,它会起作用。

else 关键字后使用 break 命令有什么问题?

如果我运行这个,我会收到以下错误:

...     print(a) if a > 0 else break
  File "<stdin>", line 2
    print(a) if a > 0 else break
                               ^
SyntaxError: invalid syntax

这是因为

print(a) if a > 5 else break

三元运算符。三元运算符不是if语句。这些适用于语法:

<expr1> if <expr2> else <expr3>

相当于一个"虚函数":

def f():
    if <expr2>:
        return <expr1>
     else:
         return <expr3>

因此,这意味着else旁边的部分应该是一个表达式break不是一个表达,而是一个声明。所以Python并不期望这样。你不能return break.

在python-2.x中,print也不是函数。因此,这将导致print语句出错。在python-2.x中,print是一个关键字。

您可以将代码重写为:

a = 5
while True:
    if a > 5:
        print(a)
    else:
        break
    a -= 1

您可以在文档和 PEP-308 中阅读有关此内容的更多信息。

If是一个表达式,break类似于return是一个语句。你不能在一个句子中使用两个语句(除非你使用一个丑陋的分号(。我知道如果我们能做到这一点会很酷,但唉,事情就是这样。

用稍微简单的术语来说,你误用了"单行if语句"(三元运算符(。它总是计算为一个表达式(即一个值(。那是

<expr1> if <condition> else <expr2>

如果<condition> True,则计算<expr1>,如果<condition> False则计算<expr2>。然后,可以像任何 Python 值一样使用此结果值,例如:

y = 0
x = (5 if (y > 0) else 6)
print(x) # 6

当然,括号是完全不必要的(甚至不鼓励(,但希望对理解该行的含义有用。

因此

print(a) if a > 0 else break

尝试评估print(a)(根据 Python 3 中对 print() 的定义,它总是返回 None – 完全有效,但可能不是您通常想要的(然后break,它不计算任何内容,因为它是一个语句(动作(,而不是表达式(值(,因此invalid syntax错误。

因此,如果你想根据条件执行两个语句之一,你确实需要由 威廉·范·昂森。可能有黑客的方法可以在一行中做到这一点,但是在Python中,多行是通常的解决方案。

最新更新