2015-03-08 3 views
-2

Вопрос: В чем проблема, если python продолжает повторять один и тот же ввод снова и снова и не будет продвигаться до конца программы?Python не будет продвигаться

Where do you want to go? X 
And how many days will you be staying in X? 1 
And how many days will you be staying in X? 2 
And how many days will you be staying in X? 164 
And how many days will you be staying in X? 59 
... 

Вот соответствующая часть кода:

# Import modules 
import destinations 
import currency 

save_itinerary = True 
main_function = True 
while (main_function): 

    # Determine length of stay 
    while True: 
     try: 
      length_of_stay = int(input("And how many days will you be staying in " + destinations.destination[0] + "? ")) 
      # Check for non-positive input 
      if (length_of_stay <= 0): 
       print("Please enter a positive number of days.") 
       continue 
     except ValueError: 
      print("The value you entered is invalid. Only numerical values are valid.") 
      break 
     else: 
      break 
+0

Трудно догадаться без кода, но с верхней части моей головы я бы проверил ваши условия завершения цикла. – seaotternerd

+0

Опубликовать этот раздел кода. – erip

+0

[program] (http://pastebin.com/CXH3pH3z) Я получу две другие программы за минуту – sithlorddahlia

ответ

2

Причина ваш код зацикливания является то, что у вас есть два вложенных while петли, и вы никогда не вырваться из внешней. Вы используете операторы break для выхода из внутреннего цикла, но условие для внешнего цикла никогда не изменяется, и вы никогда не выполняете break на правом уровне, чтобы выйти из него.

Вот что я думаю, что лучшая версия кода будет:

# get rid of the outer while loop, which was never ending 
while True: 
    try: 
     length_of_stay = int(input("And how many days will you be staying in " + destinations.destination[0] + "? ")) 
     if (length_of_stay <= 0): 
      print("Please enter a positive number of days.") 
      continue 
    except ValueError: 
     print("The value you entered is invalid. Only numerical values are valid.") 
     # don't break here, you want to stay in the loop! 
    else: 
     break 

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

Вы также можете переместить else: break блок вверх и отступа его так, чтобы он прикреплен к if заявления, а не заявления try/except (а затем избавиться от ненужного continue заявления). Это делает поток немного более очевидным, хотя на самом деле нет ничего плохого в том, как это происходит сейчас.

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