And / Or 运算符返回值

40
我在观看一段2007年的Python高级使用或Python理解视频,18分27秒时演讲者声称:“正如某些人所知,在Python中andor返回两个值中的一个,而not始终返回一个布尔值。”这种情况是什么时候发生的?
就我所知,andor也返回布尔值。

可能会让你困惑的是,你可以在看似需要布尔值的上下文中使用任何数据类型。例如"if 17: blah"是合法的。 - Russell Borogove
4个回答

63

andor 运算符返回它们的一个操作数,而不是像 TrueFalse 一样的纯布尔值:

>>> 0 or 42
42
>>> 0 and 42
0

虽然not不总是返回纯布尔值:

>>> not 0
True
>>> not 42
False

2
你知道操作数返回的顺序是什么吗?是从第一个到最后一个吗? - atp
11
决定结果(即真或假)的第一个值(从左到右)是结果。 - Martin v. Löwis
Python中的比较运算符也返回纯布尔值(例如:x < 5或像0 < x <= 1这样链式使用,甚至是5 > x < y;链式比较会在任何布尔值被返回之前完成)。 - Attila the Fun

42
请见Python官方文档中的表格:

布尔运算


3
“is false”这一部分有些令人困惑。更准确的说法应该是等于False,或者在if语句中评估为False。 - Adam
3
不,它绝对不像“等于False”。例如,0[]都是false,但只有第一个等于False。实际规则在前面的部分有详细解释,但仍然有些难以理清。这就是为什么在现实生活中,每个人(包括核心开发人员)都会用“truthy”和“falsey”来代替,但参考文档避免使用这种说法。 - abarnert
就“is false”如何被解释器评估而言,我认为2.7从未在任何地方明确定义它,尽管您可以从__nonzero__文档中猜测它的含义是x.__nonzero__() == 0 except AttributeError: x.__len__() == 0 except AttributeError: False - abarnert

24

来自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

在这两种情况下,返回的值均为非布尔值并且未引发任何异常。


0

需要在@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的操作数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接