2012-03-21 95 views
0
22 and 333/12 or 1 

我遇到了上面的代码行。结果是27,但我不太明白andor在这种情况下的含义。有人可以向我解释,首选的例子。提前致谢!!'和'和'or'在Python中如何处理非布尔值?

+0

请注意,如果您希望在条件为True时产生一个False值 - 22和None或1将使'1'不是'None',此技巧不起作用。 '(None,1)[22]'确实有效,只要可以评估真值和假值,因为它不会短路。 – agf 2012-03-21 02:16:52

+1

下面的答案很好,但是如果你找到写这行代码的人,你应该给他们一记耳光 – wim 2012-03-21 02:18:25

回答

8

这是"and-or trick" - andor实际上并不返回布尔值;相反,他们返回其中一个输入参数。人们曾经使用它来控制流量。

从python 2.5开始,由于引入了条件表达式,所以不再需要它了。

22 and 333/12 or 1 

相当于

333/12 if 22 else 1 
+0

+1为什么这个工程的原因。 – Blender 2012-03-21 01:46:25

+5

“if else”更具可读性。我希望人们不会诉诸于和/或欺骗。 – Anorov 2012-03-21 01:51:31

+0

我认为内联的'if ... else ...'没有在老的Python版本中实现,所以支持它们的脚本可能仍然会使用它。 – Blender 2012-03-21 01:53:33

5

A and B返回如果A是假的,或B,否则:

>>> 0 and 1 
0 
>>> False and True 
False 
>>> True and 'yes' 
'yes' 
>>> True and '' 
'' 

同样, 'A或B' 返回如果A是真实的,或B,否则:

>>> 0 or 1 
1 
>>> False or True 
True 
>>> '' or 'yes' 
'yes' 
>>> False or '' 
'' 
>>> 'yes' or '' 
'yes' 
+0

而且由于'和'在Python中的优先级高于'或',所以'22和333/27'被评估为比'333/12或'。 '0和333/27或1'会返回'1'。 – 2012-03-21 01:44:20

0

让我们分开出:

22 and 333/12 or 1 
(22 and 333/12) or (1) # Parentheses are nice 
(22 and 27) or (1)  # 333/12 = 27 because you are using integers for division 
22 and 27    # 22 and 27 is True, as neither of them is False 
27      # Not sure why anything is returned, but the second 
         # value always returned if it is True 
0

逻辑操作数和,或将在这个特殊的sc根据优先规则进行安排。

首先它会计算333/12,它是27,然后它将变成22和27或1,这相当于27,并且或者具有相同的优先级。

22 and 333/12 or 1 
22 and 27 or 1 
(22 and 27) or 1 OR 22 and (27 or 1) 

27 ,27 

但在Python 3.2的情况下,它计算到27.75。

>>> 22 and 333/12 or 1 
27.75 
>>> (22 and 333/12) or 1 
27.75 
>>> 22 and (333/12 or 1) 
27.75 
+0

在'或'之前评估'和',查看其他答案。 – agf 2012-03-21 02:18:24

1

在Python,非零数被计数为真布尔表达式的目的,并且零计为假。所以即使andor通常与布尔型号TrueFalse一起使用,它们也可以用于数字。

问题是:像10 and 3这样的表达式的值是什么值,其中两个值的计算结果都是true?在C中,它具有类似的整型布尔语义,10 && 3的值为1,这是最常用的真值。但是,在Python中,这个表达式的值是3,和表达式的后半部分。这是有道理的,因为和短路,这意味着0 and 3是0,所以and有“如果它是假的第一个值,否则第二个”的语义。

你发布的表达如何?通过运算符优先级,这是一样的

(22 and 333/12) or 1 

22 and 333/12值是333/12,这是27.自或运营商短路,Python解释器评估27 or 1时需要第一个真正的价值,并得到27。