2013-12-22 2 views
11

Dies ist eine Frage von codeacademy.com, wo ich Python lerne. Also was ich will, ist eine Funktion zu definieren, die überprüft, ob eine Zahl prim ist. Wenn dies der Fall ist, geben Sie True zurück. Wenn nicht, gib False zurück.Funktion is_prime - Fehler

Hier ist mein Code:

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] - ich diese Bedingung gemacht, weil in Codecademy es sagt: "Hint Denken Sie daran: alle Zahlen kleiner als 2 sind nicht Primzahlen"

[2] - Wenn ich zum Beispiel 'print is_prime (11)' oder 'is_prime (6)' starte, funktioniert es einwandfrei. Also reiche ich die Antwort ein, aber die Codeacademy akzeptiert sie nicht. Es heißt: "Ihre Funktion schlägt auf is_prime (-2) fehl. Es gibt True zurück, wenn es False zurückgeben soll."

+4

Hallo und willkommen zu Stackoverflow schreiben. Eigentlich ist das eine sehr gute Frage, und Sie haben alle notwendigen Informationen zur Verfügung gestellt, um Ihr Problem zu reproduzieren - dies ist sehr selten für StackOverflow-Erstplakate. Also herzlichen Glückwunsch dazu (und auch auf dein Englisch). Freut mich, Sie hier zu haben! –

+2

Ich empfehle http://pythontutor.com für die Visualisierung der Ausführung: Wenn Sie dorthin gehen, und fügen Sie Ihren Code in das Ausführungsfenster, werden Sie sehen, warum Sie 'True' für' is_prime (-2) 'erhalten. –

+3

Außerdem müssen Sie nicht alle Zahlen zwischen '2' und' x' überprüfen, wenn Sie Primzahlen finden wollen - 'int (math.sqrt (x))' ist eine ausreichend hohe obere Grenze. –

Antwort

11

Mal sehen, was passiert, wenn Sie -2 eingeben:

  • range(2,-2) leer ist, so dass die for Schleife läuft nie.
  • Daher ist lst immer noch [] nach der Schleife.
  • Daher ist 'False' in lstFalse
  • Daher wird return True ausgeführt.
+0

Vielen Dank! Ich habe es nicht bemerkt! Diese Community ist so hilfreich (: – vicaashow

4

Wenn x-2 ist, range(2, x) wird eine leere Liste erzeugen.

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

So werden die Schleife und die Bedingungen innerhalb der Schleife nicht ausgeführt. Die letzte if-Bedingung wird geprüft, und 'False' ist in der lst. Also, es gibt True zurück.

Sie können das gleiche Programm wie dieses

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

Vielen Dank! Ich habe es nicht bemerkt! Diese Community ist so hilfreich (: – vicaashow

+0

Sie sind herzlich willkommen :) – 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

Bitte beachten Sie, um Ihren Code ein wenig zu erklären, anstatt es nur zu werfen die Öffentlichkeit. – philnate