我知道Python中的条件表达式是X,如果C else Y,但我在使用它时遇到了一些问题。
我有两个代码需要比较。
代码1:
def fun(p):
if len(p) >= 2:
p[1] = 'Ok'
else:
p.append('Ok')
p = [1]
fun(p)
print p
输出代码1:
[1, 'Ok']
代码2:
def fun(p):
(p[1] = 'Ok') if (len(p) >= 2) else p.append('OK')
p = [1]
fun(p)
print p
输出代码2:
(p[1] = 'Ok') if (len(p) >= 2) else p.append('OK')
^
SyntaxError: invalid syntax
我知道在代码1中,其格式为“if C:X else:Y”,评估顺序为:
代码2抛出语法错误,原因可能是p [1]不存在。所以我猜测格式“X if C else Y”的评估如下:
但这只是我的猜测。有没有人知道代码1错误时代码2错误的真正原因?
答案 0 :(得分:4)
您拥有SyntaxError
的原因是因为Python区分语句和表达式。
作业,如
p[1] = 'Ok'
是语句,不能是表达式的一部分,包括条件表达式。有关详细信息,请参阅What is the difference between an expression and a statement in Python?。
评估顺序没有进入 - SyntaxError
在任何代码被评估之前发生,当它被解析时。
在if
语句和条件表达式中,评估顺序为 ether
或强>
所以,在
if condition:
true_statement
else:
false_statement
或
true_statement if condition else false_statement
只评估fase语句的真实或,具体取决于条件的真实性。
答案 1 :(得分:0)
正如Dan D.指出的那样,你不能在表达语境中有陈述。
为了学习 - 我不建议这样做 - 我将向您展示如何使用内联X if C else Y
来完成您尝试做的事情:
def fun(p):
p.__setitem__(1, 'Ok') if len(p) >= 2 else p.append('OK')
正如您所看到的,您的拳头版本更具可读性。
答案 2 :(得分:0)
作业没有表达(其他人指出了)。因此语法错误。
关于评估顺序的问题:
首先在 if-else 表达式(!)中计算条件操作数,然后计算then-operand(最左边)或else-operand(最右边)。另一个操作数是不评估。
在或 - 表达式中,操作数从最左边到最右边(a or b or c or d or ...
)进行评估,但直到找到一个布尔值为True的操作数。其余的表达式未评估。
在和 - 表达式中,操作数从最左边到最右边(a and b and c and d and ...
)进行计算,但直到找到一个布尔值为False的操作数。其余的表达式未评估。
在外部表达式(当然)之前评估内部表达式:third(second(first()))
在所有其他情况(a() + b()
,f(g(), h())
,a[b[c]] = d() + e
)中,订单定义为specified。通常它是从左到右,除了赋值(它在左边之前)。