2013-12-22 10 views
11

これはcodeacademy.comの質問です。ここではPythonを学習しています。 私が望むのは、数値がプライムであるかどうかを調べる関数を定義することです。 この場合はTrueを返します。 そうでない場合は、Falseを返します。ここで関数is_prime - エラー

は私のコードです:

def is_prime(x): 
    lst = []  # empty list to put strings 'False' and 'True' 

    for i in range(2,x): # starting at 2 and not including x (number 1 is a divisor of all numbers 

     if x <= 2:   # [1] see bellow the explanation 
      lst.append('False') 
      break 

     elif x % i == 0: # if x is divisible by i(number between 2 and not including x) 
      lst.append('False') 
      break  # break, because we already know x is not prime 

     elif x % i > 0: 
      lst.append('True') # x is not divisible by i 

    if 'False' in lst: 
     return False  # x is not prime - return False 

    else: 
     return True # 'True' is in lst, so x is prime - return True 

print is_prime(-2) # [2] I get an error here. See below 

[1] - codeacademyにそれが言うので、私はこの条件を作った: "!ヒント は覚えている:2は素数ではありませんよりも、すべての数字が少ないです"

[2] - たとえば 'print is_prime(11)'または 'is_prime(6)'を実行すると、正常に動作します。だから私は答えを提出するが、codeacademyはそれを受け入れない。それは言う: "あなたの関数はis_prime(-2)で失敗し、Falseを返す必要があるときにTrueを返します。"

+4

こんにちはそして歓迎のように同じプログラムを書くことができます。実際、これは非常に良い質問であり、問​​題を再現するために必要なすべての情報を提供しています。これはStackOverflowの最初のポスターにとって非常にまれです。おめでとうございます(そしてあなたの英語でも)。ここにいるとうれしい! –

+2

実行を視覚化するためにhttp://pythontutor.comを強くお勧めします。そこに行ってコードを実行ウィンドウに貼り付けると、なぜis_prime(-2)に 'True'が得られるのかがわかります。 –

+3

それ以外に素数を見つけたい場合は '2'と' x'の間のすべての数値をチェックする必要はありません。 'int(math.sqrt(x))'は十分に高い上限です。 –

答えて

11

はあなたが-2を入力するときに何が起こるか見てみましょう:

  • range(2,-2)は空なので、forループが実行されることはありません。
  • したがって、lstはループ後もまだ[]です。したがって、return Trueが実行されます。
+0

ありがとうございました!私はそれを気づかなかった!このコミュニティは非常に役に立ちます( – vicaashow

4

-2の場合、range(2, x)は空のリストを生成します。

print range(2, -2) # will print [] 

したがって、ループ内のループ条件とif条件は実行されません。最後のif条件がチェックされ、lstには'False'はありません。したがって、それはTrueを返します。

あなたはStackOverflowのこの

def is_prime(x): 
    if x < 2: 
     return False 
    prime_flag = True 
    for i in range(2,x): 
     if x % i == 0: 
      prime_flag = False 
      break 
    return prime_flag 

print is_prime(-2) 
+0

ありがとうございました!私はそれを認識しませんでした!)このコミュニティは非常に役に立ちます( – vicaashow

+0

あなたは歓迎です:) – thefourtheye

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

ちょうどあなたのコードを説明してください公共。 – philnate