2016-07-14 8 views
-1

Немного предыстории: мне нужно сделать код на Python, который помогает пользователю устранить неисправность своего телефона для школьного проекта. Пользователь должен отвечать только «да» или «нет» на вопросы, заданные программой.Бесконечный цикл while Python

Проблема, с которой я сталкиваюсь, заключается в том, что ввод чего-то другого, кроме «Да» или «Нет», вызывает цикл while, который должен бесконечно циклироваться, а не показывать только один раз и перейти к следующему вопросу после того, как пользователь наберет «Да», или «Нет».

Код еще не закончен, поэтому может показаться, что некоторые из советов/вопросов отсутствуют.

EDIT: код функционирует правильно! Спасибо за ваши ответы, ребята! Они были действительно полезны!

phoneFault = raw_input("Is your phone physically damaged?") 
while phoneFault != "Yes" and phoneFault != "No": 
    print("Error; you can only answer 'Yes' or 'No' to the questions.") 
if phoneFault == "Yes" or phoneFault == "yes": 
    phoneFault = raw_input("Is your phone wet?") 
    if phoneFault == "Yes" or phoneFault == "yes": 
     phoneFault = raw_input("Are you able to turn it off?") 
     if phoneFault == "Yes" or phoneFault == "yes": 
      print("Send the phone to the manufacturer and ask if they can fix it.") 
     elif phoneFault == "No" or phoneFault == "no": 
      print("Dry the phone, and then wait for the phone to run out of power and then restart it.") 
+0

Вы никогда не изменяете значение 'phoneFault', поэтому условие while никогда не изменяется. Попробуйте добавить еще один phoneFault = raw_input («Is ...») после этого. – dave

ответ

2
while phoneFault != "Yes" and phoneFault != "No": 
    print("Error; you can only answer 'Yes' or 'No' to the questions.") 

Эта линия является виновником. Как только кто-то вводит что-то другое, кроме "Yes" или "No", мы вводим этот цикл while. Во время этого цикла while значение phoneFault остается неизменным, и поэтому мы продолжаем печатать сообщение об ошибке бесконечно.

Если вы добавите возможность изменения значения phoneFault во время этого цикла while, это решит вашу проблему.

0

Всякий раз, когда вы получаете бесконечный цикл, посмотрите на состояние, затем посмотрите, что может изменить это условие. Вы, вероятно, хотите что-то вроде этого, поместите raw_input внутри цикла:

phoneFault = None 
while phoneFault != "Yes" and phoneFault != "No": 
    phoneFault = raw_input("Is your phone physically damaged?") 
    print("Error; you can only answer 'Yes' or 'No' to the questions.") 

Это не очень удобный, хотя. Имея нажать < сдвиг>, чтобы получить капитал Y или N. Вы могли бы рассмотреть это вместо:

phoneFault = None 
while phoneFault != "yes" and phoneFault != "no": 
    phoneFault = raw_input("Is your phone physically damaged (Yes/No)? ").lower() 
+0

Не хотите ли вы напечатать ошибку перед повторным опросом для ввода пользователем? – Tyler

+0

Во втором решении я отбросил сообщение об ошибке как ненужное. – cdarke

0

Хотя у вас есть только два ответа за if состояния, я лично предпочитаю тест if phoneFault in ('Yes','yes'): членства. Это делает код более читаемым. Если вы хотите, чтобы phoneFault соответствовал всем, что напоминало «да» или «нет», вас могут интересовать регулярные выражения из модуля re.

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