我在Python中遇到了gcd的这个实现:
def gcd(x,y): return y and gcd(y, x % y) or x
Run Code Online (Sandbox Code Playgroud)
我不明白的是布尔值在返回时是如何工作的?在解释器中尝试了一些数字后,我注意到and总是返回右边or的数字,而返回左边的数字.为什么是这样?另外,您可以一步一步地通过简单调用此函数来指导我,以便了解发生了什么?
这是因为Python and和or运营商如何评估.
从文档 -
表达式
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)
在你的情况下,它的作用是 -
如果y为0则返回x(与x的值无关).
否则它计算gcd(y, x%y)如果非零则返回它.(虽然它永远不会真的如此0)
如果结果gcd(y, x%y)为0,则返回x.