首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python表示数字的布尔人

用Python表示数字的布尔人
EN

Stack Overflow用户
提问于 2015-08-22 03:19:48
回答 4查看 604关注 0票数 1

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

代码语言:javascript
复制
def gcd(x,y): return y and gcd(y, x % y) or x

我不明白的是布尔值是如何在返回中工作的?在解释器中尝试了一些数字之后,我注意到and总是返回右边的数字,而or则返回左边的数字。为什么会这样呢?另外,你能一步一步地引导我完成这个函数的简单调用,这样我才能理解正在发生的事情吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-22 03:25:15

这是因为andor运算符在Python中的计算方式。

来自文件-

表达式x and y首先计算x;如果x为false,则返回其值;否则,计算y并返回结果值。 表达式x or y首先计算x;如果x为true,则返回其值;否则,计算y并返回结果值。

它们不返回TrueFalse,它们返回最后一个求值值,这就是为什么我们可以编写如下-

代码语言:javascript
复制
s = s or "Some default value"

s的值为None或空字符串或空列表或0,则为默认值。

基本上,or返回第一个非类假值(其中类假值为0,或无值或空字符串/列表/元组等)或最后一个类假值(如果所有值都是类假的)。例子-

代码语言:javascript
复制
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返回第一个类假值,或者返回最后一个类真值。例子-

代码语言:javascript
复制
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

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

  1. 如果y为0,则返回x(不管x的值如何)。
  2. 否则,它将计算gcd(y, x%y),如果是非零,则返回它。(虽然它永远不会真的是0)
  3. 如果gcd(y, x%y)的结果为0,则返回x
票数 5
EN

Stack Overflow用户

发布于 2015-08-22 03:22:15

这叫做“短路”。每当Python知道布尔表达式的结果是什么时,它就停止计算。这是一种优化,但它也提供了一些方便的习惯用法,比如分配默认值。

代码语言:javascript
复制
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的,这并不明显。我想说的是,这是一个滥用短路评估的例子。

票数 1
EN

Stack Overflow用户

发布于 2015-08-22 03:25:11

在Python中,惟一默认为False的整数是零。正如注释之一所说,逻辑值执行短路。

声明如下:

代码语言:javascript
复制
a and b

如果'a‘计算为False,那么'b’不需要计算,因此表达式的结果是'a',但是如果'a‘计算为True,那么b仍然需要计算,所以b将是表达式的结果,除非a计算为False。

“`or”的工作方式正好相反,如果你想一想,这是有道理的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32151921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档