22 and 333/12 or 1
我遇到了上面的代码行。结果是27,但我不太明白and
和or
在这种情况下的含义。有人可以向我解释,首选的例子。提前致谢!!'和'和'or'在Python中如何处理非布尔值?
22 and 333/12 or 1
我遇到了上面的代码行。结果是27,但我不太明白and
和or
在这种情况下的含义。有人可以向我解释,首选的例子。提前致谢!!'和'和'or'在Python中如何处理非布尔值?
这是"and-or trick" - and
和or
实际上并不返回布尔值;相反,他们返回其中一个输入参数。人们曾经使用它来控制流量。
从python 2.5开始,由于引入了条件表达式,所以不再需要它了。
22 and 333/12 or 1
相当于
333/12 if 22 else 1
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'
而且由于'和'在Python中的优先级高于'或',所以'22和333/27'被评估为比'333/12或'。 '0和333/27或1'会返回'1'。 – 2012-03-21 01:44:20
让我们分开出:
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
逻辑操作数和,或将在这个特殊的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
在'或'之前评估'和',查看其他答案。 – agf 2012-03-21 02:18:24
在Python,非零数被计数为真布尔表达式的目的,并且零计为假。所以即使and
和or
通常与布尔型号True
和False
一起使用,它们也可以用于数字。
问题是:像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。
请注意,如果您希望在条件为True时产生一个False值 - 22和None或1将使'1'不是'None',此技巧不起作用。 '(None,1)[22]'确实有效,只要可以评估真值和假值,因为它不会短路。 – agf 2012-03-21 02:16:52
下面的答案很好,但是如果你找到写这行代码的人,你应该给他们一记耳光 – wim 2012-03-21 02:18:25