Problem mit Befehl break in Python Tutorial
Frage
Ich folge die Python-Tutorial auf ihrer Seite, und ich bin derzeit in der Pause fortsetzen Abschnitt. Ich habe gerade versucht, diesen Beispielcode.
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print n, 'equals', x, '*', n/x
... break
... else:
... # loop fell through without finding a factor
... print n, 'is a prime number'
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
Und statt auszuspucken, was es sagt über ich
3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3
Es scheint mir, dass es weiterhin die innen für Schleife laufen, aber warum sollte das Tutorial nicht berücksichtigt? Ist es veraltet für den neuesten Interpreter Build (Ich bin mit xubuntu fesch)?
Ich war in der Lage, es zu beheben, indem Sie die Zeile hinzufügen
else:
... if n != y:
... print n, 'is a prime number'
... y = n
, aber ich bin besorgt darüber, diese Praxis schlechte Codierung sein kann. Vielen Dank für Ihre Hilfe.
Lösung
Die Ausgabe, die Sie zeigen, enthält ten mal die Zeichenfolge " x ist eine Primzahl". Jedoch wird diese Zeichenfolge im else
Klausel der inneren Schleife gedruckt, und als solche ausgeführt höchstens einmal für jede Ausführung der inneren Schleife.
Da die äußere Schleife acht Iterationen durchführt, " x eine Primzahl" kann nicht gedruckt werden, mehr als acht mal. Somit ist die Ausgabe, die Sie angezeigt werden kann nicht durch den Code gezeigt bewirkt werden.
Fazit : etwas ist faul. Können Sie den Code zeigen, wie Sie es ausgeführt?
Edit: gelöst
Sie eingekerbt fälschlicherweise die else-Klausel, so dass Python sie als Angehörige der if
Aussage interpretiert. Python behandelt eine Registerkarte als 8 Räume. Vielleicht ist Ihr Editor zeigt Tabs als 4 Räume. Auf diese Weise haben Sie möglicherweise diesen Fehler verpasst. Per PEP 8 , bitte Tabs und Leerzeichen nicht mischen, und vorzugsweise vier Leerzeichen verwenden, um Ihren Code einrücken.
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print n, 'equals', x, '*', n/x
... break
... else:
... # loop fell through without finding a factor
... print n, 'is a prime number'
...
3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3
Andere Tipps
Meine beste Vermutung ist, dass Ihre ‚else:‘ Aussage nicht richtig eingerückt ist, und dann logisch Ihr Ergebnis ist, prüfen Sie, dass Sie andere Einbuchtung auf Ebene mit ‚für x‘ ist
.d. Sie verwenden:
for n in range(2,10):
for x in range(2,n):
if n%x == 0:
print(n, '=', x, '*', n/x)
break
else:
print(n, 'is a prime')
statt:
for n in range(2,10):
for x in range(2,n):
if n%x == 0:
print(n, '=', x, '*', n/x)
break
else:
print(n, 'is a prime')
Sie müssen Ihr Python-Interpreter aktualisieren.
Dieser Code läuft richtig für mich (Hinweis Python-Versionsnummer):
Python 2.6.1 (r261:67515, Dec 6 2008, 16:42:21)
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print n, 'equals', x, '*', n/x
... break
... else:
... # loop fell through without finding a factor
... print n, 'is a prime number'
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
Ich glaube, Sie haben Einzüge falsch. Wenn ich den Code nehmen, und die sonst einrücken, so dass sie unter der if-Anweisung ist, bekomme ich genau die Ausgabe, die Sie bekommen.
Der folgende Code reproduziert die Ausgabe,
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print n, 'equals', x, '*', n/x
break
else:
# loop fell through without finding a factor
print n, 'is a prime number'
, während
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print n, 'equals', x, '*', n/x
break
else:
# loop fell through without finding a factor
print n, 'is a prime number'
tut, was Sie wollen, es zu tun.
Beachten Sie die verschiedenen im Einrücken des anderen.
Ich dachte, dass else
sollte immer mit if
ausgerichtet werden. Das ist, was ich gelesen habe. Aber in diesem Primzahl Generator Code, der einzige Weg, die Primzahlen einmal geschrieben zu bekommen, ist else
mit for x
ausrichten. Also ich habe keine Erklärung für eine solche identation. Obwohl ich bin gerade erst Python zu lernen.