【问题标题】:Python Function Return Statement is Confusing and ComplexPython 函数返回语句令人困惑和复杂
【发布时间】:2016-10-07 15:31:54
【问题描述】:

任何人都可以解释一下'and'和'or'语句在下面函数的return语句中的作用吗? 该函数似乎返回 a 和 b 的最大公分母。

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

谢谢!

【问题讨论】:

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


【解决方案1】:

我们可以做的第一件事就是放在括号里:

((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 知道如何在需要时获取对象的“真值”。例如:

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

【讨论】:

    【解决方案2】:

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

    b达到0时(连续赋值给a % b的结果后),b and gcd(b, a % b)将变为False,并返回a的值。

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2017-01-17
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多