python条件表达式有哪几个_Python中条件表达式的评估顺序是什么?

本文探讨了Python中的条件表达式`x if c else y`的使用,并通过两个代码示例解释了为何代码1能正常运行而代码2引发语法错误。错误源于尝试在表达式上下文中使用赋值语句,这在Python中是不允许的。文章强调了语句和表达式的区别,并提供了关于计算顺序的澄清。此外,还讨论了如何避免误用条件表达式导致的可读性问题。
摘要由CSDN通过智能技术生成

我知道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)。但至少我们对此有明确的认识——毫无疑问,这是专门为副作用而做的。

@拉齐尔感谢你给我另一个解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值