Python 这是为什么;及或;三元表达式语法工作?
我最近一直在学习和使用Python,并遇到了以下代码,我被告知这是Python中三元表达式的常用缩写:Python 这是为什么;及或;三元表达式语法工作?,python,ternary-operator,Python,Ternary Operator,我最近一直在学习和使用Python,并遇到了以下代码,我被告知这是Python中三元表达式的常用缩写: x = condition and expression1 or expression2 现在我熟悉了?:运算符,并使用Python常用的三元表达式x=expression1if-condition-else-expression2,但这个新表达式对我来说似乎有点奇怪 我感到困惑的一部分是它看起来不太可读,也就是说,当我读到这一行时,它并没有立即说明发生了什么,但另一部分是我不太明白它为什么
x = condition and expression1 or expression2
现在我熟悉了?:类C语言中的code>运算符,并使用Python常用的三元表达式x=expression1if-condition-else-expression2
,但这个新表达式对我来说似乎有点奇怪
我感到困惑的一部分是它看起来不太可读,也就是说,当我读到这一行时,它并没有立即说明发生了什么,但另一部分是我不太明白它为什么起作用
总之:为什么上面的表达式的功能与类C三元表达式相同?当且仅当左操作数为真时,和
运算符计算其右操作数(表达式1
)。同样地,或
运算符计算其右操作数(expression2
),当且仅当其左操作数为false时
因此,如果条件
为真,表达式1
将被计算。假设它的计算结果是真实的,则表达式条件和表达式1
将为真,因此不会计算表达式2
如果condition
为false,expression1
不会被计算,并且condition and expression1
为false。因此将对表达式2进行评估
唯一的问题是如果条件
为真,但表达式1
的计算结果为假。在这种情况下,将对expression1
和expression2
进行评估。因此,当这是一种可能性时,此构造被破坏。和
运算符返回左操作数(如果为falsy),返回右操作数(如果左操作数为truthy)
相反地,或
运算符返回左操作数(如果为真),返回右操作数(如果左操作数为假)
例如:
>>> [] and "test" # [] is falsy
[]
>>> [] or "test"
"test"
>>> "foo" and "bar" # "foo" is truthy
"bar"
>>> "foo" or "bar"
"foo"
正如其他人所指出的,这两种结构并不等同:
>>> True and 0 or 1
1
>>> 0 if True else 1
0
这在Python中起作用的真正原因是这些操作符被短路,执行是从左到右的。如果已有足够的信息回答布尔表达式,则不会执行其余操作数。如果expression1
返回false,它将执行这两个表达式,这将无法正常工作
最常见的用法是只有一个运算符的语句
condition and expression
如果条件
为true,则使用或
的相关语句将在条件
为false时执行表达式
这并不适用于所有语言,例如APL将计算所有操作数 它比三元语句更布尔。它的使用方式与使用类似C的三元语句的方式相同,我想知道为什么它作为一个语句工作。“通用速记”真的吗?它失败于:True和0或1
。最好避免这种代码,因为它依赖于副作用,只需使用实三元或if语句。我同意其他评论者的观点,这在Python中既不是常见的做法,也可能不是好的做法。尽管这一“技巧”在类似“潜入Python”的语言介绍中有所体现,但它确实与Python的禅宗格格不入,除非你非常熟悉布尔逻辑(大多数人不是)。对。因此,短路和非布尔操作数对和
和或
的混合导致了这一点。我感到困惑,因为我假设逻辑运算符,如和
和或
只接受布尔运算作为操作数,并作为布尔表达式计算。有趣。我从问题和答案中得出的结论是,它既不可读,也不安全。那么,最好避免?Darragh是的,避免。在foo if bar else baz
或常规的if
语句上使用此语句是没有意义的。@Darragh,这取决于上下文。它们并不等同。也许有人需要这种表达方式。@freakish我想这里隐含着“作为if-else的替代品”。当然,从语言设计的角度来看,如果x==1,y==2或z==3,那么做这样的事情是完全可以的:
+1(这与禅宗相反,更强调了这是一种隐含的欺骗)。