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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top