我正在尝试使用 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中,多行是通常的解决方案。