Как выйти из цикла while-true после 5 попыток? - PullRequest
1 голос
/ 20 марта 2019

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

while True:
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")
print("Welcome!")

Как мне изменить его так, чтобы после 5 попыток / угадывания пароля было написано "все угадывания пароля" (или что-то в этом роде)?

Ответы [ 5 ]

3 голосов
/ 20 марта 2019

Многие люди не знакомы с конструкцией for...else, которая в данном случае классическая

for attempt in range(5):
    password = input('What is your password?')
    if password == "abc123":
        print("Welcome!")
        break
else:
    print("all out of password guesses")

else выполняется, только если break не встречается

0 голосов
/ 20 марта 2019

В качестве альтернативы вы можете использовать while ... else loop:

attempts = 0
while attempts < 5:
    password = input('What is your password?')
    if password == "abc123":
        print("Welcome!")
        break
    print("Please Try Again")
    attempts += 1
else:
    print('You have exceeded the number of allowed login attempts!')
0 голосов
/ 20 марта 2019

По сути, это не совсем «пока верно», если у вас есть предел цикла. Вы можете добиться того же, просто проверив пароль 5 (или n раз).

try_num = 0
    while try_num <= 5:
        try_num = try_num + 1
        <rest of the code>

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

try_num = 0
success = False
    while True:
        try_num = try_num + 1
        password = input('What is your password?')
        if password == "abc123":
            success = True
            break
        if try_num > 5:
            break
        print("Please Try Again")
if success == True:
    print("Welcome!")

Вы можете заметить, что вариант 1 более элегантный и простой в обслуживании.

0 голосов
/ 20 марта 2019

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


max_tries = 5

while max_tries > 0: # We will decrement max_tries on each loop
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")
    max_tries -= 1 # Decrement max_tries

if max_tries==0: # We tried too many times
    raise ValueError("Too many attempts!")

Однако, может быть немного понятнее использовать цикл for


for i in range(max_tries):
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")

if i == max_tries:
    raise ValueError("Too many attempts")

Вы можете использовать else в конце цикла for следующим образом:

for i in range(max_tries):
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")

else:
    raise ValueError("Too many attempts")

Где else поймает случай, когда break не был вызван до конца цикла

0 голосов
/ 20 марта 2019

Создайте счетчик и просчитайте его.Условие цикла while должно быть «когда счетчик достигнет 0»:

counter = 5
while counter > 0:
    counter -= 1
    password = input('What is your password?')
    if password == "abc123":
        break
    print("Please Try Again")
print("Welcome!")

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


В качестве альтернативы более правильная версия будет использовать цикл for вместо цикла while:

for i in range(5):  # will execute 5 times with i = 0, 1, 2, 3, 4 in that order
    ...

но если вы не используете переменную i для чего-либо конкретного, while будет работать так же хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...