2016-04-24 20 views
3

私は最近コーディングを開始し、CodecademyでPythonを習得しようとしている間に完全に理解できなかったことに遭遇しました。Pythonのエラー[初心者]

このタスクは、番号が素数であったかどうかを知る関数を作成することでした。だからここ

が私の最初の解決策だった。それを実行した後

def is_prime(x): 
    if x < 2: 
     return False 
    elif x == 2: 
     return True 
    else: 
     for n in range(2, x-1): 
      if x % n == 0: 
       return False 
      else: 
       return True 

print is_prime(5) 

、それはis_primeは(3)の代わりに真を与える、Falseを与えていたメッセージを与え続けました。

def is_prime(x): 
    if x < 2: 
     return False 
    elif x == 2: 
     return True 
    else: 
     for n in range(2, x-1): 
      if x % n == 0: 
       return False 
    return True 

print is_prime(5) 

それが正常に動作し始めた: だからCodecademyフォーラムで少し検索した後、私は、コードの最後のビットがにalterdした場合ことがわかりました。 この変更によってコードがどのように動作するのか誰にも分かりますか? ありがとうございます。

+1

最初のバージョンがtrueを返すときを考えてください。紙と鉛筆で例を挙げてください。エラーが何であるかははっきりしているはずです(ただし、素数を計算するときにこの間違いを犯すのは初めてではありませんが、Pythonの現在の質問にもかかわらず、心配しないでください)。 – jonrsharpe

+1

'is_prime(3)'は、 'range(2、3-1)'が空でコードが決してチャンスを得ないので、最初のバージョンでは 'True'か' False'を返す方法がありません。デフォルトの 'None'以外のものを返します。 – TigerhawkT3

+1

@ TigerhawkT3私はGraderが 'None'をfalse-yとして見たと思う。 – jonrsharpe

答えて

4

最初のコードスニペットでは、ループがほとんど実行されないことがあります。その内部のif句には、thenとelseブランチの両方があるため、どちらか一方が常に実行されます。どちらも内部にreturnがあるため、ループが初めて実行されるとすぐに関数が戻ります。 range()EXLUSIVE上限を指定しているため

はさらに 3のあなたの特定のテストケースではループでも、一度は実行されません。 range(2, 2)は空の範囲です。関数は returnなしで終了し、Pythonでは関数が Noneの特別な値を返すようになります。

2番目のコードスニペットは、与えられた数がプライムではないことを証明する反例を見つけた場合にのみ、関数を終了するように変更されました。この場合、関数から早期に復帰することはOKです.1つの除数が見つかった場合は、その数を素数にすることはできず、残りをチェックする必要はないからです。ループを見つけずにループが終了した場合にのみ、ループの後のreturn Trueに到達します。