2011-12-30 11 views
5

Estoy tratando de abrirme camino a través de Learn Python del modo difícil, y tratando de meterme donde pueda para ampliar mi educación. Pensé que esto funcionaría: configurando raw_input para establecer un límite para un ciclo while, luego deja que el ciclo while se ejecute hasta el límite que establezco con la variable "frecuencia".¿Por qué raw_input crea un ciclo infinito en esta variante de ejercicio Learn Python the Hard Way?

Es, uh, no. En cambio, envía a Python a un bucle infinito de creación de listas de números, cada uno de los cuales parece ser un incremento más largo que la última lista (muy larga).

El código original tenía "while i < 6" - He agregado la variable raw_input, e incluso si ingreso la misma variable que en el código original (6), hace esto de infinito.

Aquí está el guión 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 

Disculpas por la máxima ignorancia - Tengo una copia de Python para el Diseño de Software frente a mí en edición de bolsillo en este momento, y es la siguiente cosa en mi a -hacer una lista después de LPTHW.

+2

Puede que le resulte útil la siguiente. Se trata de comparar las cadenas y los puntos en Python. http://stackoverflow.com/questions/3270680/how-does-python-compare-string-and-int – Dunes

+1

intente cambiar 'raw_input' por' input' –

+1

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

Respuesta

6

raw_input le dará un objeto de cadena, no un número entero. Intente hacer frequency = int(frequency) antes del ciclo, hará la comparación valiosa.

+3

También sería más implícito convertir todo como una int antes de la asignación: 'frequency = int (raw_input ('Kenneth?'))'. – Makoto

+0

¡Oho! De acuerdo, lo entiendo La cadena está regresando "verdadera" y, por lo tanto, todo lo que obtengo es un ciclo "verdadero" para siempre y no el resultado puro que obtendría de un entero. ¡Gracias! – JeanSibelius

+0

@Makoto solo si maneja excepciones. 'int (raw_input (...))' arroja un 'ValueError' si el valor proporcionado no es convertible. – kojiro

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

Esa es su pista.

1

Porque raw_input genera una cadena.

>>> 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

El número introducido es una cadena en lugar de un número entero

Justo antes de añadir frequency = int(frequency) el bucle while

Cuestiones relacionadas