0

Pythonの優先順位について質問があります。次のコードがあります。

def gcdIter(a, b):
   ans = min(a,b)
   while ((a%ans is not 0) and (b%ans is not 0)):
       ans -= 1
   return ans

私の質問は、while 論理ステートメントについてです。式が私が考えていた方法で評価されることを確認するためにいくつかの括弧を追加しましたが、そうではありません。両方の式が true になる前に while ループが中断されています。私は間違っていましたか?

次のように、2 つの式を使用せずに同じことを行う方法を見つけました。

def gcdIter(a, b):
   ans = min(a,b)
   while ((a%ans + b%ans is not 0)) :
       ans -= 1
   return ans

しかし、最初のコードが思ったように実行されない理由を知りたいです。

4

1 に答える 1

7

同一性テスト (isまたはis not) を使用して、数値が等しいかどうかをテストしないでください。代わりに==またはを使用してください。!=

while a%ans != 0 and b%ans != 0:

isオブジェクトの同一性をテストします (両方の演算子が同じ python オブジェクトであること)。これは、値が等しいかどうかをテストすることと同じではありません。

0もブール値のコンテキストで考慮されるため、この場合Falseは省略できます。!=

while a % ans and b % ans:

fractionsモジュールgcd()には、最大公約数アルゴリズムを正しく実装する関数が既にあります。

from fractions import gcd

print gcd(a, b)

ユークリッド アルゴリズム、python スタイルを使用します。

def gcd(a, b):
    """Calculate the Greatest Common Divisor of a and b.

    Unless b==0, the result will have the same sign as b (so that when
    b is divided by it, the result comes out positive).
    """
    while b:
        a, b = b, a%b
    return a
于 2013-03-03T12:04:34.937 に答える