Python函数返回语句令人困惑且复杂

时间:2016-10-07 15:31:55

标签: python python-2.7 function python-3.x

任何机构都能解释'and'和'或'语句在下面函数的return语句中做了什么? 该函数似乎正在返回a和b的最大公分母。

def gcd(a,b): return b and gcd(b, a % b) or a

谢谢!

2 个答案:

答案 0 :(得分:6)

我们能做的第一件事就是加上一些括号:

((b and gcd(b, a % b)) or a)

现在让我们一块一块:

b and gcd(b, a % b)

如果b是假的,这将给b。否则它会给你gcd(b, a % b)。换句话说,它等同于以下条件表达式:

b if not b else gcd(b, a % b)

表达式的下一部分是:

(...) or a

如果前面的表达式有假结果,那么会给你a,否则它会给你前一个表达式。

请注意,如果您来自C这样的语言,其布局操作返回布尔值:-),则可能可能不是您所期望的。在python中,保证返回布尔值的唯一布尔运算是not。这一切都倾向于“正常工作”,因为python知道如何在需要时获取对象的“真值”。 e.g:

if obj:
    ...

实际上会隐式检查bool(obj)

所以,如果我使用if套件写出整个内容,它看起来像:

def gcd(a, b):
    if not b:  # Likely `b == 0`.  This is the recursion base-case.
         val = b
    else:
         val = gcd(b, a % d)

    if val:
        return val
    else:
        return a

答案 1 :(得分:0)

该函数连续返回gcd(b, a % b),而b具有真值,即在这种情况下不等于零。

b到达0时(在连续分配到a % b的结果后),b and gcd(b, a % b)将为False且值为{{1}将被退回。