Ошибка в коде генерации пароля. Просьба помочь найти причину, дать пояснение
Проблема: код ниже выдает невалидный пароль. Просьба подсказать причину, пояснить, как сделать правильно. Буду рад любой помощи. Приведенный код близок к минимально необходимому к воспроизведению проблемы.
Исходная задача: написать функцию get_password, которая сгенерирует нам случайный надежный пароль и вернет его. Алгоритм простой — мы генерируем пароль с помощью функции get_random_password и, если он проходит надежность проверкой функцией is_valid_password, возвращаем его, если нет — повторяем итерацию снова.
from random import randint
def get_random_password():
result = ""
count = 0
while count < 8:
random_symbol = chr(randint(40, 126))
result = result + random_symbol
count = count + 1
return result
def is_valid_password(password):
has_upper = False
has_lower = False
has_num = False
for ch in password:
if "A" <= ch <= "Z":
has_upper = True
elif "a" <= ch <= "z":
has_lower = True
elif "0" <= ch <= "9":
has_num = True
if len(password) == 8 and has_upper and has_lower and has_num:
return True
return False
def get_password():
count = 0
while count < 10:
if is_valid_password(get_random_password()) == True:
return (get_random_password())
else:
pass
count += 1
Ответы (1 шт):
Ниже - ваша функция с ошибкой, переделанная под отладочную печать. Все сложные строки разбиты на части, результаты распечатываются. Вы сможете увидеть из печати, что temp_pass_1 оказывается не равен temp_pass_2, и из этого понятно, в чём дело. Теперь можно убрать все временные переменные и переделать программу, как показано во второй части.
Можно и не использовать отладочную печать, а (лучше!) поставить PyCharm и запускать программу Shift+F9, поставив слева красную точку щелчком мыши на каждой подозрительной строке. Далее, нажимая F8, вы сможете идти по шагам и видеть значения переменных прямо в тексте кода (поищите видео по PyChаrm, если короткое пояснение не очень понятно).
Еще оптимальнее просто в голове прокручивать, как всё должно быть, глядя на код, но это умение придёт со временем.
def get_password():
count = 0
while count < 10:
temp_pass_1 = get_random_password()
print (temp_pass_1)
if is_valid_password(temp_pass_1) == True:
temp_pass_2 = get_random_password()
print(temp_pass_2)
return (temp_pass_2)
else:
pass
count += 1
relaible_password = get_password()
print (relaible_password)
Исправленный код в результате такой отладки:
def get_password():
count = 0
while count < 10:
# Убрали ошибку: ввели переменную, чтобы не изменялось значение
random_password = get_random_password()
# Улучшили: равенство True проверяется по умолчанию,так что убрали конец строки
if is_valid_password(random_password):
return (random_password)
else:
pass
count += 1