Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中带数字的布尔值_Python_Boolean - Fatal编程技术网

Python中带数字的布尔值

Python中带数字的布尔值,python,boolean,Python,Boolean,我在Python中遇到了gcd的这个实现: def gcd(x,y): return y and gcd(y, x % y) or x 我不明白的是布尔值在返回中是如何工作的?在解释器中尝试了一些数字后,我注意到和总是返回右边的数字,而或总是返回左边的数字。为什么会这样?另外,你能一步一步地引导我完成这个函数的一个简单调用吗?这样我就可以理解发生了什么事。这叫做“短路”。每当Python知道布尔表达式的结果是什么时,它就会停止计算。这是一种优化,但也有一些方便的习惯用法,比如指定默认值 def

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

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