我从http://www.s-anand.net/euler.html获取了一段代码,问题5:
def gcd(a,b):
print a,b
return b and gcd(b, a % b) or a
print gcd(10,20)
给出输出:
10 20
20 10
10 0
10
为什么最后一行只打印“a”而不是b。
请解释一下上述代码中的return语句是如何工作的。
我对“和”和“或”操作符感到困惑。
答案 0 :(得分:6)
Python的and
和or
运算符使用的short-circut evaluation类型一开始有点令人困惑。
如果它们是作为函数编写的,它们会像这样工作,除非他们甚至不评估正确的值,除非他们需要。
def and(left, right):
if left:
return right
else:
return left
def or(left, right):
if left:
return left
else:
return right
所以行return b and gcd(b, a % b) or a
可以更详细地写成:
if b:
temp_1 = gcd(b, a % b)
else:
temp_1 = False
if temp_1:
return temp_1
else:
return a
如果你计算出逻辑,这相当于找到GCD的常用方法。但是,除非您已熟悉Python,否则此代码将难以阅读,因此您可能希望避免使用此样式。
答案 1 :(得分:6)
b and gcd(b, a % b) or a
是旧的写作方式:
gcd(b, a % b) if b else a
答案 2 :(得分:3)
因为10是你案件中最大的公约数,例如结果gcd(10,20)
您的代码(返回b和gcd(...)或a)与:
相同def gcd(a,b):
print a,b
if b:
return b
else:
res = gcd(b, a % b)
return res if res else a
另请注意gcd method in fractions module:
from fractions import gcd
print gcd(10,20)