我在观看一段2007年的Python高级使用或Python理解视频,18分27秒时演讲者声称:“正如某些人所知,在Python中
就我所知,
and
和or
返回两个值中的一个,而not
始终返回一个布尔值。”这种情况是什么时候发生的?就我所知,
and
和or
也返回布尔值。and
和or
返回两个值中的一个,而not
始终返回一个布尔值。”这种情况是什么时候发生的?and
和or
也返回布尔值。and
和 or
运算符返回它们的一个操作数,而不是像 True
或 False
一样的纯布尔值:
>>> 0 or 42
42
>>> 0 and 42
0
虽然not
不总是返回纯布尔值:
>>> not 0
True
>>> not 42
False
x < 5
或像0 < x <= 1
这样链式使用,甚至是5 > x < y
;链式比较会在任何布尔值被返回之前完成)。 - Attila the Fun0
和[]
都是false,但只有第一个等于False
。实际规则在前面的部分有详细解释,但仍然有些难以理清。这就是为什么在现实生活中,每个人(包括核心开发人员)都会用“truthy”和“falsey”来代替,但参考文档避免使用这种说法。 - abarnert__nonzero__
文档中猜测它的含义是x.__nonzero__() == 0 except AttributeError: x.__len__() == 0 except AttributeError: False
。 - abarnert来自Python文档:
not操作符如果其参数为false则返回True,否则返回False。
表达式x and y首先计算x;如果x是false,则返回它的值;否则,计算y并返回结果值。
表达式x or y首先计算x;如果x是true,则返回它的值;否则,计算y并返回结果值。
Python的or
操作符返回第一个“真”值或最后一个值,并停止运算。这对于需要备用值的常见编程任务非常有用。
例如下面这个简单的示例:
print my_list or "no values"
如果my_list
有值,它将打印出来。否则,它将打印no values
(如果列表为空或为None
...)。
一个简单的例子:
>>> my_list = []
>>> print my_list or 'no values'
no values
>>> my_list.append(1)
>>> print my_list or 'no values'
[1]
当你需要一个守卫而不是回退时,可以使用使用 and
进行补充,它会返回第一个 False-y 值或最后一个值,并停止。
像这样:
my_list and my_list.pop()
这很有用,因为你不能在常见的列表前值None
或[]
上使用list.pop
。
一个简单的例子:
>>> my_list = None
>>> print my_list and my_list.pop()
None
>>> my_list = [1]
>>> print my_list and my_list.pop()
1
在这两种情况下,返回的值均为非布尔值并且未引发任何异常。
需要在@Frédéric的答案中添加一些要点。
返回它们的操作数之一吗?
这是正确的,但这不是背后的逻辑。在Python中,除0以外的数字被视为True,数字0被视为False。
(0 and 42 -> False and True) = False。
这就是为什么它返回0的原因。
(0 or 42-> false or True) = 42
在这种情况下,由于操作数42,语句将为True。因此,Python返回导致语句为true的操作数。