2016-04-24 7 views
3

Ich habe vor kurzem angefangen zu programmieren und stieß auf etwas, das ich nicht vollständig verstanden habe, als ich versuchte, Python in der Codecademy zu lernen.Python-Fehler in der Funktion [Anfänger]

Die Aufgabe war es, eine Funktion zu erstellen, die sagen würde, ob sie aufgerufen wurde, ob die Nummer eine Primzahl war oder nicht.

Also hier meine erste Lösung war:

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) 

Nach dem Ausführen es, hielt es die Nachricht zu geben, die is_prime (3) falsch war zu geben, anstatt eine wahre geben. So nach ein wenig auf den Codecademy Foren Suche fand ich, dass, wenn das letzte Bit des Codes wurde alterd zu:

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) 

begann es normal arbeiten. Kann mir jemand erklären, wie diese Änderung den Code verursacht hat? Vielen Dank im Voraus.

+1

Denken Sie darüber nach, wenn Ihre erste Version wahr zurückgibt. Arbeite an einem Beispiel mit Papier und Bleistift. Es sollte ziemlich offensichtlich sein, was der Fehler ist (obwohl Sie bei der Berechnung von Primzahlen bei weitem nicht die erste Person sind, die diesen Fehler macht, auch wenn Sie heute nur Python SO Fragen stellen, also keine Angst). – jonrsharpe

+1

Ich sehe nicht, wie 'is_prime (3) 'entweder' True' oder 'False' für die erste Version zurückgibt, da' range (2, 3-1) 'leer ist und somit der Code nie eine Chance bekommt gib etwas anderes als den Standard 'None' zurück. – TigerhawkT3

+1

@ TigerhawkT3 Ich denke, der Grader sah 'None' als falsch-y – jonrsharpe

Antwort

4

Was im ersten Code-Snippet passiert, ist, dass die Schleife kaum eine Chance hat zu laufen. Die if-Klausel darin hat sowohl einen als auch einen else-Zweig, so dass einer von ihnen immer ausgeführt wird. Da beide einen return darin haben, kehrt die Funktion zurück, sobald die Schleife zum ersten Mal ausgeführt wird.

Zusätzlich in Ihrem speziellen Testfall von 3 die Schleife läuft nicht auch nur einmal, weil range() ein gebundene exlusive oberen angibt. range(2, 2) ist eine leere Reihe. Die Funktion erreicht ihr Ende ohne return und in Python, das die Funktion verursacht, einen speziellen Wert None zurückzugeben.

Das zweite Code-Snippet wurde geändert, um die Funktion nur zu verlassen, wenn ein Gegenbeispiel gefunden wird, das beweist, dass die angegebene Zahl nicht prim war. In diesem Fall ist es in Ordnung, früh von der Funktion zurückzukommen, denn wenn ein Teiler gefunden wurde, kann die Nummer möglicherweise kein Prime sein, und es besteht keine Notwendigkeit, den Rest zu überprüfen. Nur wenn die Schleife beendet wird, ohne eine zu finden, wird die return True nach der Schleife erreicht.