2013-08-09 4 views
3

Я начал программирование с помощью python вчера, поэтому я довольно новичок!Переменные меняют значения внутри цикла

У меня есть эта функция, которая должна проверить

  1. если вставленное значение является числом
  2. , если число не больше, чем 31 (см код ниже)

В процессе отладки, Я выяснил эту ошибку, которую я не понимаю:

  1. Я выбираю намеренно число, большее 31, например 45
  2. он снова запрашивает меня, и я выбираю правильный номер, например, 7
  3. В коде я прошу дважды печатать переменную voto (в комментариях я называю их «POINT A» и «POINT B»)
  4. на выходе я получаю:

    7

    45

и я снова Aske d для ввода другого номера.

Я не понимаю, почему переменные меняют свое значение сразу после запуска цикла while.

Не могли бы вы объяснить это мне, используя очень простые слова? (< - пожалуйста, помните, что я новичок!: D)

Заранее благодарю вас!

def controlla_voto(voto_lett): 
    flag=1 
    while flag: 
     for y in voto_lett: 
      if (ord(y) in range(48,58))==0: 
       voto_lett=raw_input("Invalid charachters, try again: ") 
       flag=1 
       break 
      else: flag=0 
    voto=int(voto_lett) 
    print voto # POINT A 
    while (voto in range(32))==0: 
     print voto #POINT B 
     voto_lett=raw_input("Invalid number, try again: ") 
     controlla_voto(voto_lett) 
    return voto 
+2

'(ord (y) в диапазоне (48,58)) == 0'? Вы имели в виду 'not isdigit (y)'? –

+2

Исправьте углубление в вставленной программе; иначе мы не сможем это понять. –

+0

Я пытаюсь вам помочь, но код не имеет смысла, и я не могу понять, как вы называете этот метод ... – joaoricardo000

ответ

2

Это идеальный вариант! Вы просто забыли возвращение на рекурсивный звонок.

def controlla_voto(voto_lett): 
flag=1 
while flag: 
    for y in voto_lett: 
     if (ord(y) in range(48,58))==0: 
      voto_lett=raw_input("Invalid charachters, try again: ") 
      flag=1 
      break 
     else: flag=0 
voto=int(voto_lett) 
print voto # POINT A 
while (voto in range(32))==0: 
    print voto #POINT B 
    voto_lett=raw_input("Invalid number, try again: ") 
    return controlla_voto(voto_lett) 
return voto 

Другим решением было бы:

voto = controlla_voto(voto_lett) 

но что-то нужно, чтобы выйти из цикла.

+0

Спасибо за ответ! Почему я должен добавить возврат? – user2669155

+3

Чтобы узнать рекурсивные вызовы, вам сначала нужно научиться рекурсивным вызовам ... – joaoricardo000

+0

Потому что вы хотите получить результат второго вызова. – Jiminion

Смежные вопросы