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

时间:2017-06-30 14:31:04

标签: python loops if-statement break ternary-operator

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

示例代码:

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

当然,如果我用传统的方式写作(不使用一个班轮),它就可以了。

请告诉我在break关键字后使用else命令有什么问题。

3 个答案:

答案 0 :(得分:16)

如果我运行此命令,则会收到以下错误:

...     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

三元运算符。三元运算符 no if语句。这些使用语法:

<expr1> if <expr2> else <expr3>

等同于到“虚拟功能”:

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

这意味着else旁边的部分应该是表达式break 不是表达式,它是一个声明。所以Python并不期望这样。您无法return break

中,print也不是一个功能。所以这会导致print语句错误。在 print中有一个关键字。

您可以将代码重写为:

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

您可以在documentationPEP-308

中详细了解相关信息

答案 1 :(得分:5)

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

答案 2 :(得分:1)

用稍微简单的术语来说,你误用了'一行if语句'(ternary operator)。它总是评估为表达式(即值)。也就是说,

<expr1> if <condition> else <expr2>
如果<expr1><condition>,则

评估为True;如果<expr2><condition>,则评估为False。然后可以像使用任何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 - 完全有效,但可能不是您通常想要的那样)然后{{ 1}},不评估任何内容,因为它是statement (action), not an expression (value),因此break错误。

因此,如果你想根据条件执行两个语句中的一个,你真的需要提出的多行解决方案 Willem Van Onsem。可能有一些hacky方法可以在一行中完成,但多行是Python中常见的解决方案。