2011-12-30 7 views
5

Sto provando a farmi strada attraverso Learn Python the Hard Way, e sto cercando di gingillarmi dove posso per migliorare la mia formazione. Pensavo che avrebbe funzionato: impostare raw_input per impostare un limite per un ciclo while, quindi lasciare che il ciclo while si esegua fino al limite che stabilisco con la variabile "frequency".Perché raw_input crea un ciclo infinito in questa variante di esercitazione Learn Python the Hard Way?

E, no. Invece, manda Python in un ciclo infinito di creazione di liste di numeri, ognuna delle quali sembra essere un incremento più lungo dell'ultima (molto lunga) lista.

Il codice originale aveva "while i < 6" - Ho aggiunto la variabile raw_input, e anche se inserisco la stessa variabile del codice originale (6), fa questa cosa a ciclo infinito.

Ecco lo script completo:

i = 0 
numbers = [] 

print "What is the frequency?" 
frequency = raw_input ('Kenneth? ') 

while i < frequency: 
    print "At the top i is %d" % i 
    numbers.append(i) 
    i = i + 1 
    print "Numbers now: ", numbers 
    print "At the bottom i is %d" % i 

print "The numbers: " 

for num in numbers: 
    print num 

Scuse per la massima ignoranza - Ho una copia di Python per Software Design di fronte a me in edizione economica in questo momento, ed è la prossima cosa sulla mia per -fare la lista dopo LPTHW.

+2

Si potrebbe trovare il seguente utile. Si tratta di come stringhe e int sono confrontati in python. http://stackoverflow.com/questions/3270680/how-does-python-compare-string-and-int – Dunes

+1

prova a cambiare 'raw_input' a' input' –

+1

o 'frequency = int (raw_input ('Kenneth?'))) ' –

risposta

6

raw_input vi darà un oggetto stringa, non un numero intero. Prova a fare frequency = int(frequency) prima del ciclo, renderà il confronto prezioso.

+3

Sarebbe anche più implicito il cast dell'intera cosa come int prima dell'assegnazione: 'frequency = int (raw_input ('Kenneth?'))'. – Makoto

+0

Oho! Ok, ho capito. La stringa restituisce "true" e quindi tutto quello che sto ottenendo è un ciclo "vero" per sempre e non il risultato puro che otterrei da un intero. Grazie! – JeanSibelius

+0

@Makoto solo se gestisci le eccezioni. 'int (raw_input (...))' genera un 'ValueError' se il valore fornito non è int incappabile. – kojiro

2
>>> 3 < '2' 
0: True 

Questo è il tuo suggerimento.

1

Poiché raw_input risulta in una stringa.

>>> frequency = "10" 
>>> i = 0 
>>> while i < frequency: 
...  i = i + 1 
...  print i 
...  if i > 20: break 
... 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
1

Il numero immesso è una stringa piuttosto che un intero

Basta aggiungere frequency = int(frequency) prima che il ciclo while

Problemi correlati