2016-10-07 13 views
-1

以下の関数のreturn文で 'and'と 'or'文が何をしているのか説明できますか? 関数は、aとbの最大の共通分母を返すようです。Python関数の返信文が混乱し複雑である

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

ありがとうございます!

+1

いくつかの良い読書があります:http://www.diveintopython.net/power_of_introspection/and_or.htmlこれは、 'と'と 'や'の使い方をもっと深く説明するべきです。 –

+0

ありがとうございました。あなたのリンクが最も役に立つ回答でした!私は多くのことを学びました ! – pemfir

答えて

6

私たちが行うことができますまず最初は、いくつかの括弧内に置かれた:

b and gcd(b, a % b) 

bがfalsyある場合、これはbを与える:

((b and gcd(b, a % b)) or a) 

は、今作品で、この作品を撮ることができます。それ以外の場合はgcd(b, a % b)となります。言い換えれば、それは、以下の条件式と同等です:

b if not b else gcd(b, a % b) 

式の次の部分がある:

前の式がそうでない場合は、falsy結果を持っている場合は、あなたに aを与える
(...) or a 

あなたに前の式を与えます。あなたはブール演算が:-)ブール値を返すCのような言語から来る場合は、このあなたが期待しているものではないかもしれないことを

は注意してください。 Pythonでは、がブール値を返すようにに保証されている唯一のブール演算はnotです。しかし、これはすべて「ちょうどうまくいく」傾向があります。なぜなら、Pythonは必要なときにオブジェクトの「真理値」を取得する方法を知っているからです。例:

if obj: 
    ... 

実際にbool(obj)を暗黙にチェックします。私はifスイートを使用して全体のことを書き出すした場合

ので

、それは次のようになります。bはtruthy値を有している

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 
+0

ご返信ありがとうございました! – pemfir

0

機能を継続的にすなわち等しくない、gcd(b, a % b)を返します。この場合はゼロです。

(連続a % bの結果に割り当てされた後)b0に達し、b and gcd(b, a % b)Falseなり、aの値が返されます。