在Python中使用数字的布尔值

b_p*_*kes 1 python boolean

我在Python中遇到了gcd的这个实现:

def gcd(x,y): return y and gcd(y, x % y) or x
Run Code Online (Sandbox Code Playgroud)

我不明白的是布尔值在返回时是如何工作的?在解释器中尝试了一些数字后,我注意到and总是返回右边or的数字,而返回左边的数字.为什么是这样?另外,您可以一步一步地通过简单调用此函数来指导我,以便了解发生了什么?

Ana*_*mar 5

这是因为Python andor运营商如何评估.

文档 -

表达式x and y首先评估x; 如果x为false,则返回其值; 否则,y将评估并返回结果值.

表达式x or y首先评估x; 如果x为真,则返回其值; 否则,y将评估并返回结果值.

他们没有返回,True或者False他们返回最后评估的值,这就是为什么我们可以编写像 -

s = s or "Some default value"
Run Code Online (Sandbox Code Playgroud)

默认值为sif None或空字符串或空列表,或0.


基本上,or返回第一个非类似false的值(其中类似false的值为0,或None或Empty string/list/tuple等)或者如果所有值都是假的,则返回最后一个类似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]: ()
Run Code Online (Sandbox Code Playgroud)

并且,and如果所有值都是真的,则返回第一个类似false的值或最后一个类似true的值.示例 -

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
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它的作用是 -

  1. 如果y为0则返回x(与x的值无关).

  2. 否则它计算gcd(y, x%y)如果非零则返回它.(虽然它永远不会真的如此0)

  3. 如果结果gcd(y, x%y)为0,则返回x.