在Python中,对于非布尔值,'and'和'or'如何起作用?
在Python中,非零数字在布尔表达式中被视为True,而零被视为False。因此,尽管and
和or
通常与布尔值True
和False
一起使用,它们也可以与数字一起使用。
问题在于,当两个值都被评估为true时,诸如10 and 3
这样的表达式的值是什么?在具有类似整数作为布尔值的语义的C语言中,10 && 3
的值为1,即最常用的true值。然而,在Python中,这个表达式的值是3,即and表达式的后半部分。这是有道理的,因为and具有短路的特性,意味着0 and 3
的值是0,所以and具有“如果第一个值为false,就取第一个值,否则取第二个值”的语义。
那么你发表的表达式呢?根据运算符优先级,它与下面的表达式相同:
(22 and 333/12) or 1
22 and 333/12
的值是333/12
,即27。由于or运算符短路,当计算27 or 1
时,Python解释器会取第一个true值,得到27。
在Python中,当使用'and'和'or'操作符与非布尔值一起使用时,会出现一些特殊的行为。当使用'and'操作符时,如果第一个值为false,则返回第一个值;否则,返回第二个值。当使用'or'操作符时,如果第一个值为true,则返回第一个值;否则,返回第二个值。
这种行为的原因是Python中的逻辑运算符对于非布尔值也能正常工作。例如,当使用'and'操作符时,如果第一个值为false,则无论第二个值是什么,结果都将为false。同样地,当使用'or'操作符时,如果第一个值为true,则无论第二个值是什么,结果都将为true。
解决这个问题的方法是根据具体的需求使用适当的条件表达式来控制逻辑运算符的行为。例如,如果希望确保两个值都为true才返回true,则可以使用'and'操作符。如果希望只要一个值为true就返回true,则可以使用'or'操作符。
此外,还需要注意Python中逻辑运算符的优先级。'and'操作符比'or'操作符具有更高的优先级,因此在表达式中使用这两个操作符时需要注意顺序。如果有需要,可以使用括号来明确指定运算的顺序。
总之,通过合理使用逻辑运算符,我们可以在Python中对非布尔值进行逻辑运算,并根据需要控制运算的行为。这种灵活性使得Python在处理逻辑运算时更加方便和简洁。
在Python中,'and'和'or'运算符不仅仅可以用于布尔值,还可以用于非布尔值。这种特性被称为“and-or trick”。在过去,人们常常使用这种特性来进行控制流程。但是从Python 2.5开始,引入了条件表达式,因此不再需要使用“and-or trick”。
具体来说,以下代码段:
22 and 333/12 or 1
等价于
333/12 if 22 else 1
使用条件表达式的代码更加易读,我们希望人们不再使用“and-or trick”。
一些旧版本的Python可能没有实现内联if...else...语法,所以仍然使用“and-or trick”的脚本可能会继续使用它。
除了可读性外,还有一些其他方面的问题,可以参考对问题的评论。
需要注意的是,“and-or trick”的链接已经失效,而且cond and x or y
并不是x if cond else y
的逻辑等价物。一个正确的等价物应该是(cond and [x] or [y])[0]
。