Выход из цикла while с часовым в Python - PullRequest
0 голосов
/ 14 сентября 2018

Итак, я только что создал простую программу, чтобы попытаться использовать контролируемые циклом while в Python 3.7.Однако, когда пользователь вводит значение дозорного, цикл не заканчивается.Я не могу найти проблему в моем коде.

print('Welcome to the WiFi Connection Wizard, here are some troubleshooting steps:')

SOLVE= 'no'

while SOLVE != 'yes' : 
    print('\nPlease reboot your computer and then try to reconnect.')
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')

    print('\nPlease reboot your router and then try to reconnect.')
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')

    print('\nPlease make sure the cables between the router and modem are securely plugged in.')
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')

    print('\nPlease try moving the router to a different location.')
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')

    SOLVE = 'yes'

Когда пользователь вводит yes, цикл по какой-то причине продолжается.Я что-то пропустил?Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я предполагаю, что вы ожидаете завершения цикла после любого из запросов SOLVE, верно? например Если пользователь перезагружает свой компьютер, а затем пытается подключиться, и после первого шага он набирает yes, цикл должен завершиться?

Условие в цикле while оценивается только после того, как ВСЕ содержимое этого блока завершило работу, и Python решает, запускать ли весь блок в другой раз. Ваш код на самом деле не имеет смысла, как написано. Минимальная петля, контролируемая дозором, может выглядеть следующим образом:

print('Welcome to the WiFi Connection Wizard, here are some troubleshooting steps:')

SOLVE= 'no'
while SOLVE != 'yes' :
    print('\nIs it magically working now?')
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')

Программа будет зацикливаться до тех пор, пока пользователь не введет yes, после чего остановится.

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

print('Welcome to the WiFi Connection Wizard, here are some troubleshooting steps:')

messages = [
    'Please reboot your computer and then try to reconnect.',
    'Please reboot your router and then try to reconnect.',
    'Please make sure the cables between the router and modem are securely plugged in.',
    'Please try moving the router to a different location.'
]

for m in messages:
    print('\n{}'.format(m))
    solve = input('Did this solve your problem? Plase type "yes" or "no": ')
    if solve == 'yes':
        break
0 голосов
/ 14 сентября 2018

Неважно, что пользователь вводит в код, который вы разместили; он всегда будет выдавать запрос четыре раза, затем игнорировать ответы пользователя и установить SOLVE на 'yes', а затем быстро завершить цикл. Если вы хотите сломать раньше, вам нужно проверять SOLVE после каждого его задания; while условие проверяется только тогда, когда тело цикла заканчивается (или вы continue), и оно возвращается к началу. Ваш цикл на самом деле ничего не делает здесь.

Возможное решение заключается в явном тестировании после каждого input:

while SOLVE != 'yes' : 
    print('\nPlease reboot your computer and then try to reconnect.')
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')
    if SOLVE == 'yes':
        break

    print('\nPlease reboot your router and then try to reconnect.')
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')
    if SOLVE == 'yes':
        break

    print('\nPlease make sure the cables between the router and modem are securely plugged in.')
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')
    if SOLVE == 'yes':
        break

    print('\nPlease try moving the router to a different location.')
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')
    if SOLVE == 'yes':
        break

    SOLVE = 'yes'

Но while все еще довольно бессмысленен; все, что он делает, это упрощает пропуск оставшихся тестов, и у вас есть тонна повторного кода.

Более полезная структура цикла будет заключаться в цикле по набору приглашений, чтобы вы вообще не дублировали код, а структура цикла предоставляет больше, чем просто способ пропустить последующие тесты, это помогает структурировать ваш код для лучшая читаемость и уменьшенный шаблон:

prompts = ('\nPlease reboot your computer and then try to reconnect.',
           '\nPlease reboot your router and then try to reconnect.',
           '\nPlease make sure the cables between the router and modem are securely plugged in.',
           '\nPlease try moving the router to a different location.')
for prompt in prompts:
    print(prompt)
    SOLVE= input('Did this solve your problem? Plase type "yes" or "no": ')
    if SOLVE == 'yes':
        break
...