我在Python中看到了gcd的这个实现:
def gcd(x,y): return y and gcd(y, x % y) or x我不明白的是布尔值是如何在返回中工作的?在解释器中尝试了一些数字之后,我注意到and总是返回右边的数字,而or则返回左边的数字。为什么会这样呢?另外,你能一步一步地引导我完成这个函数的简单调用,这样我才能理解正在发生的事情吗?
发布于 2015-08-22 03:25:15
这是因为and和or运算符在Python中的计算方式。
来自文件-
表达式
x and y首先计算x;如果x为false,则返回其值;否则,计算y并返回结果值。 表达式x or y首先计算x;如果x为true,则返回其值;否则,计算y并返回结果值。
它们不返回True或False,它们返回最后一个求值值,这就是为什么我们可以编写如下-
s = s or "Some default value"若s的值为None或空字符串或空列表或0,则为默认值。
基本上,or返回第一个非类假值(其中类假值为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]: ()并且,如果所有的值都是真类的,则and返回第一个类假值,或者返回最后一个类真值。例子-
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。发布于 2015-08-22 03:22:15
这叫做“短路”。每当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的,这并不明显。我想说的是,这是一个滥用短路评估的例子。
发布于 2015-08-22 03:25:11
在Python中,惟一默认为False的整数是零。正如注释之一所说,逻辑值执行短路。
声明如下:
a and b如果'a‘计算为False,那么'b’不需要计算,因此表达式的结果是'a',但是如果'a‘计算为True,那么b仍然需要计算,所以b将是表达式的结果,除非a计算为False。
“`or”的工作方式正好相反,如果你想一想,这是有道理的。
https://stackoverflow.com/questions/32151921
复制相似问题