我知道python中的条件表达式是x if c else y,但是我在使用它时遇到了一些问题。
我有两个代码要比较。
代码1:
1
2
3
4
5
6
7
8def fun(p):
if len(p) >= 2:
p[1] = 'Ok'
else:
p.append('Ok')
p = [1]
fun(p)
print p
代码1的输出:
1[1, 'Ok']
代码2:
1
2
3
4
5
6def fun(p):
(p[1] = 'Ok') if (len(p) >= 2) else p.append('OK')
p = [1]
fun(p)
print p
代码2的输出:
1
2
3(p[1] = 'Ok') if (len(p) >= 2) else p.append('OK')
^
SyntaxError: invalid syntax
我知道代码1的格式是"if c:x else:y",评估顺序是:
C
X
Y
代码2引发语法错误,原因可能是P[1]不存在。所以我猜"x如果c else y"的格式是这样计算的:
X
C
Y
但这只是我的猜测。有人知道代码2错误而代码1正确的真正原因吗?
注意,赋值是语句,不能出现在表达式上下文中。这就是代码2中出现错误的原因。
使用SyntaxError的原因是因为python区分了语句和表达式。
作业,比如
1p[1] = 'Ok'
是语句,不能是表达式的一部分,包括条件表达式。看看在python中表达式和语句有什么区别?更多信息。
计算的顺序不包含在其中——当对任何代码进行分析时,SyntaxError发生在对其进行计算之前。
在if语句和条件表达式中,计算的顺序是ether
条件
真实陈述
或
条件
虚假陈述
所以,在
1
2
3
4if condition:
true_statement
else:
false_statement
或
1true_statement if condition else false_statement
根据条件的真实性,只评估true或fase语句。
谢谢你的帮助,我现在知道有什么不同。
作业不是表达(其他人指出)。因此出现了语法错误。
关于您关于评估顺序的问题:
在if else表达式中(!)首先计算条件操作数,然后计算then操作数(最左边)或else操作数(最右边)。不计算另一个操作数。
在OR表达式中,操作数是从最左到最右(a or b or c or d or ...)进行计算的,但直到找到布尔值为真的操作数为止。不计算其余表达式。
在和表达式中,操作数是从最左到最右(a and b and c and d and ...)进行计算的,但直到找到布尔值为假的操作数为止。不计算其余表达式。
内部表达式在外部表达式(当然)之前进行计算:third(second(first()))。
在所有其他情况下(a() + b()、f(g(), h())、a[b] = d() + e,订单定义如下。通常它是从左到右的,除了赋值(它在左前右)。
正如丹D.指出的,在表达式上下文中不能有语句。
为了学习——我不建议这样做——我将向您展示如何使用内联X if C else Y来完成您要做的工作:
1
2def fun(p):
p.__setitem__(1, 'Ok') if len(p) >= 2 else p.append('OK')
如您所见,您的第一个版本的可读性要高得多。
可读性是你不这样做的唯一原因吗?(使用三元运算符语法产生副作用似乎不礼貌。)
@李昂当然是对的——这是误用三元运算符,因为我们只是在丢弃答案(要么是None,要么是None)。但至少我们对此有明确的认识——毫无疑问,这是专门为副作用而做的。
@拉齐尔感谢你给我另一个解决方案。