Problema durante l'utilizzo del comando break nel tutorial di Python
Domanda
Sto seguendo il tutorial di Python sul loro sito e sono attualmente nella sezione continua interruzione. Ho appena provato questo codice di esempio.
>>> 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
E invece di sputare quello che dice sopra ottengo
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
Mi sembra che continui a eseguire l'interno per il ciclo, ma perché il tutorial non dovrebbe tenerne conto? È obsoleto per l'ultima build dell'interprete (sto eseguendo xubuntu jaunty)?
Sono stato in grado di risolverlo aggiungendo la linea
else:
... if n != y:
... print n, 'is a prime number'
... y = n
ma sono preoccupato che questa potrebbe essere una cattiva pratica di programmazione. Grazie per il tuo aiuto.
Soluzione
L'output che mostri contiene dieci volte la stringa " x è un numero primo " ;. Tuttavia, questa stringa è stampata nella clausola else
del ciclo interno ed è quindi eseguita al massimo una volta per ogni esecuzione del ciclo interno.
Poiché il ciclo esterno esegue otto iterazioni, " x è un numero primo " non può essere stampato più di otto volte. Pertanto, l'output visualizzato non può essere generato dal codice mostrato.
Conclusione : qualcosa è sospetto. Puoi mostrare il codice mentre lo hai eseguito?
Modifica: risolto!
Hai indentato erroneamente la clausola else, in modo tale che Python la interpretasse come appartenente all'istruzione if
. Python considera una scheda come 8 spazi. Forse il tuo editor visualizza le schede come 4 spazi. In questo modo potresti aver perso questo errore. Secondo PEP 8 , non mescolare schede e spazi, e preferibilmente usa quattro spazi per indentare il tuo codice.
>>> 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
Altri suggerimenti
La mia ipotesi migliore è che la tua frase 'else:' non sia correttamente rientrata, e quindi il tuo risultato è logico, controlla che il rientro di qualcun altro sia al livello con 'for x'.
vale a dire. tu usi:
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')
anziché:
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')
Potrebbe essere necessario aggiornare l'interprete Python.
Questo codice funziona correttamente per me (nota il numero di versione di Python):
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
Penso che tu abbia sbagliato i rientri. Se prendo il tuo codice e indento il resto in modo che rientri nell'istruzione if, ottengo esattamente l'output che stai ricevendo.
Il codice seguente riproduce il tuo output,
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'
, mentre
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'
Fa quello che vuoi che faccia.
Nota il diverso nel rientro dell'altro.
Ho pensato che else
dovesse sempre essere allineato con se
. Questo è quello che ho letto. Ma in questo codice generatore di numeri primi, l'unico modo per ottenere una volta i numeri primi è allineare else
con per x
. Quindi non ho spiegazioni per tale identificazione. Anche se sto iniziando a imparare Python.