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

pem*_*fir -1 python function python-2.7 python-3.x

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

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

谢谢 !

mgi*_*son 6

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

((b and gcd(b, a % b)) or a)
Run Code Online (Sandbox Code Playgroud)

现在让我们一块一块:

b and gcd(b, a % b)
Run Code Online (Sandbox Code Playgroud)

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

b if not b else gcd(b, a % b)
Run Code Online (Sandbox Code Playgroud)

表达式的下一部分是:

(...) or a
Run Code Online (Sandbox Code Playgroud)

这将给你a如果前面的表达式有falsy结果,否则会给你以前的表达.

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

if obj:
    ...
Run Code Online (Sandbox Code Playgroud)

实际上会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
Run Code Online (Sandbox Code Playgroud)