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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top