Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 这是为什么;及或;三元表达式语法工作?_Python_Ternary Operator - Fatal编程技术网

Python 这是为什么;及或;三元表达式语法工作?

Python 这是为什么;及或;三元表达式语法工作?,python,ternary-operator,Python,Ternary Operator,我最近一直在学习和使用Python,并遇到了以下代码,我被告知这是Python中三元表达式的常用缩写: x = condition and expression1 or expression2 现在我熟悉了?:运算符,并使用Python常用的三元表达式x=expression1if-condition-else-expression2,但这个新表达式对我来说似乎有点奇怪 我感到困惑的一部分是它看起来不太可读,也就是说,当我读到这一行时,它并没有立即说明发生了什么,但另一部分是我不太明白它为什么

我最近一直在学习和使用Python,并遇到了以下代码,我被告知这是Python中三元表达式的常用缩写:

x = condition and expression1 or expression2
现在我熟悉了
?:运算符,并使用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(这与禅宗相反,更强调了这是一种隐含的欺骗)。