任何机构都能解释'and'和'或'语句在下面函数的return语句中做了什么? 该函数似乎正在返回a和b的最大公分母。
def gcd(a,b): return b and gcd(b, a % b) or a
谢谢!
答案 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}将被退回。