【问题标题】: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的值。