Python中带数字的布尔值
我在Python中遇到了gcd的这个实现:Python中带数字的布尔值,python,boolean,Python,Boolean,我在Python中遇到了gcd的这个实现: def gcd(x,y): return y and gcd(y, x % y) or x 我不明白的是布尔值在返回中是如何工作的?在解释器中尝试了一些数字后,我注意到和总是返回右边的数字,而或总是返回左边的数字。为什么会这样?另外,你能一步一步地引导我完成这个函数的一个简单调用吗?这样我就可以理解发生了什么事。这叫做“短路”。每当Python知道布尔表达式的结果是什么时,它就会停止计算。这是一种优化,但也有一些方便的习惯用法,比如指定默认值 def
def gcd(x,y): return y and gcd(y, x % y) or x
我不明白的是布尔值在返回中是如何工作的?在解释器中尝试了一些数字后,我注意到和
总是返回右边的数字,而或
总是返回左边的数字。为什么会这样?另外,你能一步一步地引导我完成这个函数的一个简单调用吗?这样我就可以理解发生了什么事。这叫做“短路”。每当Python知道布尔表达式的结果是什么时,它就会停止计算。这是一种优化,但也有一些方便的习惯用法,比如指定默认值
def do_a_thing(maybelist=None):
# this is done all the time when you want the default argument to be
# a list, but you don't want to make the mistake of a mutable default argument
maybelist = maybelist or []
您给出的实现示例让一些不知道如何计算gcd的人感到困惑,因为它实际上是如何计算gcd的并不明显。我想说的是,这是有人滥用短路评估的一个例子 这称为“短路”。每当Python知道布尔表达式的结果是什么时,它就会停止计算。这是一种优化,但也有一些方便的习惯用法,比如指定默认值
def do_a_thing(maybelist=None):
# this is done all the time when you want the default argument to be
# a list, but you don't want to make the mistake of a mutable default argument
maybelist = maybelist or []
您给出的实现示例让一些不知道如何计算gcd的人感到困惑,因为它实际上是如何计算gcd的并不明显。我想说的是,这是有人滥用短路评估的一个例子 在Python中,唯一默认为False的整数是零。正如其中一条评论所说,逻辑值执行短路 声明如下:
a and b
如果“a”的计算结果为False,则不需要计算“b”,因此表达式的结果为“a”,但如果“a”的计算结果为True,则仍然需要计算b
,因此b
将是表达式的结果,除非a
的计算结果为False
`或者‘反其道而行之,如果你仔细想想,这是有意义的。在Python中,唯一默认为False的整数是零。正如其中一条评论所说,逻辑值执行短路 声明如下:
a and b
如果“a”的计算结果为False,则不需要计算“b”,因此表达式的结果为“a”,但如果“a”的计算结果为True,则仍然需要计算b
,因此b
将是表达式的结果,除非a
的计算结果为False
`或者‘反其道而行之,如果你仔细想想,这是有道理的。这是因为Python中
和以及或操作符的计算方式
从
表达式x和y
首先计算x
;如果x
为false,则返回其值;否则,将计算y
,并返回结果值
表达式x或y
首先计算x
;如果x
为真,则返回其值;否则,将计算y
,并返回结果值
它们不返回True
或False
,而是返回上一次计算的值,这就是为什么我们可以编写类似-
s = s or "Some default value"
如果其None
或空字符串或空列表,则默认值为s
,或0
基本上,或
返回第一个非类假值(类假值为0,或无或空字符串/列表/元组等),如果所有值都是类假值,则返回最后一个类假值。范例-
In [1]: 0 or 10
Out[1]: 10
In [2]: 5 or 0 or 10
Out[2]: 5
In [7]: 0 or '' or [] or ()
Out[7]: ()
In [3]: 0 and 10
Out[3]: 0
In [4]: 5 and 10
Out[4]: 10
In [6]: 5 and 0 and 10
Out[6]: 0
并且,和
返回第一个类假值,如果所有值都是类真值,则返回最后一个类真值。范例-
In [1]: 0 or 10
Out[1]: 10
In [2]: 5 or 0 or 10
Out[2]: 5
In [7]: 0 or '' or [] or ()
Out[7]: ()
In [3]: 0 and 10
Out[3]: 0
In [4]: 5 and 10
Out[4]: 10
In [6]: 5 and 0 and 10
Out[6]: 0
在您的情况下,它就像-
如果y
为0,则返回x(与x的值无关)
否则,它将计算gcd(y,x%y)
,如果该值为非零,则返回它。(虽然它永远不会是0
)
如果gcd(y,x%y)
的结果为0,则返回x
这是因为Python中和以及或操作符的计算方式
从
表达式x和y
首先计算x
;如果x
为false,则返回其值;否则,将计算y
,并返回结果值
表达式x或y
首先计算x
;如果x
为真,则返回其值;否则,将计算y
,并返回结果值
它们不返回True
或False
,而是返回上一次计算的值,这就是为什么我们可以编写类似-
s = s or "Some default value"
如果其None
或空字符串或空列表,则默认值为s
,或0
基本上,或
返回第一个非假类值(其中类假值为0,或无或空字符串/列表/元组等),或者如果所有值都是false,则返回最后一个类似false的值。范例-
In [1]: 0 or 10
Out[1]: 10
In [2]: 5 or 0 or 10
Out[2]: 5
In [7]: 0 or '' or [] or ()
Out[7]: ()
In [3]: 0 and 10
Out[3]: 0
In [4]: 5 and 10
Out[4]: 10
In [6]: 5 and 0 and 10
Out[6]: 0
并且,和
返回第一个类假值,如果所有值都是类真值,则返回最后一个类真值。范例-
In [1]: 0 or 10
Out[1]: 10
In [2]: 5 or 0 or 10
Out[2]: 5
In [7]: 0 or '' or [] or ()
Out[7]: ()
In [3]: 0 and 10
Out[3]: 0
In [4]: 5 and 10
Out[4]: 10
In [6]: 5 and 0 and 10
Out[6]: 0
在您的情况下,它就像-
如果y
为0,则返回x(与x的值无关)
否则,它将计算gcd(y,x%y)
,如果该值为非零,则返回它。(虽然它永远不会是0
)
如果gcd(y,x%y)
的结果为0,则返回x
和
和或
在Python中不是严格意义上的布尔运算符x和y
和x或y
将始终计算为x
或y
,具体取决于值的“真实性”。假值是数字零、空字符串和空容器;所有其他值均为真。这意味着
x和y==x
如果x
为假<代码>y
i