2011-12-30 16 views
5

Próbuję przebić się przez Naukę Pythona na twardą drogę i starać się robić wszystko, co w mojej mocy, aby zdobyć wiedzę. Myślałem, że to zadziała: skonfiguruj raw_input, aby ustawić limit dla pętli while, następnie pozwól pętli while wykonać limit, który ustalam ze zmienną "frequency".Dlaczego raw_input tworzy nieskończoną pętlę w tym ćwiczeniu w ćwiczeniu Python the Hard Way?

To nie robi. Zamiast tego wysyła Pythona do nieskończonej pętli tworzenia list liczbowych, z których każda wydaje się być o jeden inkrement dłuższa niż ostatnia (bardzo długa) lista.

Oryginalny kod miał "while i < 6" - Dodałem zmienną raw_input, a nawet jeśli wprowadzę tę samą zmienną co w oryginalnym kodzie (6), robi to rzecz nieskończonej pętli.

Oto pełny scenariusz:

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 

Przeprosiny dla maksymalnej ignorancji - Mam kopię Pythonie dla Software Design przede mną w miękkiej oprawie teraz, i to jest następna rzecz na mojej do -do listy po LPTHW.

+2

Można znaleźć następujące przydatne. Chodzi o to, w jaki sposób ciągi i int są porównywane w python. http://stackoverflow.com/questions/3270680/how-does-python-compare-string-and-int – Dunes

+1

spróbuj zmienić 'raw_input' na' input' –

+1

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

Odpowiedz

6

raw_input da ci obiekt typu string, a nie liczbę całkowitą. Postaraj się zrobić przed pętlą frequency = int(frequency), dzięki czemu porównanie będzie cenne.

+3

Byłoby również bardziej niejawne, aby rzucić całą rzeczą jako int przed przypisaniem: 'frequency = int (raw_input ('Kenneth?'))'. – Makoto

+0

Oho! Ok rozumiem. Ciąg zwraca "true" i dlatego wszystko, co otrzymuję, jest zawsze "prawdziwą" pętlą, a nie czystym rezultatem, jaki otrzymam z liczby całkowitej. Dzięki! – JeanSibelius

+0

@Makoto tylko w przypadku obsługi wyjątków. 'int (raw_input (...))' throws 'ValueError', jeśli podana wartość nie jest int do pobrania. – kojiro

1

Ponieważ raw_input daje ciąg znaków.

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

numer, który wpisany jest ciąg znaków, a nie całkowitą

Wystarczy dodać frequency = int(frequency) przed pętli while

Powiązane problemy