Как оценивать сложность пользовательского пароля?

Программа запрашивает пользовательский пароль и записывает в переменную password.

Необходимо посчитать сложность пароля, где за каждую пройденную проверку пароль получает +1 балл до итоговой оценки, максимальное количество баллов – 5

Проверки:

  • Длина пароля больше или равна 8 символам.
  • В пароле есть хотя бы одна цифра
  • В пароле есть хотя бы одна заглавная буква
  • В пароле есть хотя бы одна строчная буква
  • В пароле есть хотя бы один специальный символ +, -, /, _, % и т.д. (их на самом деле больше)

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

Частично задачу решил. Не могу решить вопрос с оценкой от 1 до 5

password = input('Введите пароль: ')
is_numeric = False
is_upper = False
is_lower = False
is_spec = False

if len(password) < 8:
    print('Минимальное количество символов 8')
    exit()

for char in password:
    if char.islower():
        is_lower = True
if not is_lower:
    print("добавить маленькую букву")

for char in password:
    if char.isupper():
        is_upper = True
if not is_upper:
    print("добавить большую букву")

for char in password:
    if char in "@#%&()$*?:;№!<>./,":
        is_spec = True
if not is_spec:
    print("добавить спецсимвол")

for char in password:
    if char.isdigit():
        is_numeric = True
if not is_numeric:
    print("добавить цифру")
    exit()

Ответы (2 шт):

Автор решения: Teslajke

Без кардинальных изменений вашего кода - просто добавим счетчик и объединим условия последовательно:

password = input('Введите пароль: ')
is_numeric = False
is_upper = False
is_lower = False
is_spec = False
counter = 0

if len(password) < 8:
    print('Минимальное количество символов 8')
else:
    counter += 1
    for char in password:
        if char.islower():
            is_lower = True
    if not is_lower:
        print("добавить маленькую букву")
    else:
        counter += 1
        for char in password:
            if char.isupper():
                is_upper = True
        if not is_upper:
            print("добавить большую букву")
        else:
            counter += 1
            for char in password:
                if char in "@#%&()$*?:;№!<>./,":
                    is_spec = True
            if not is_spec:
                print("добавить спецсимвол")
            else:
                counter += 1
                for char in password:
                    if char.isdigit():
                        is_numeric = True
                if not is_numeric:
                    print("добавить цифру")
                else:
                    counter += 1
print(f'Оценка общей сложности пароля: {counter}')

Также убраны ненужные exit()

→ Ссылка
Автор решения: Dmitry

Как вариант покажу, как подсчитывать булевы значения для определения "оценки"

Все ваши переменные можно положить в список, а далее обратиться к методу sum(). Поскольку для арифметических операций True равен 1, а False равен 0, тогда на выходе вы будете иметь сколько True у вас есть в списке. Прибавив единицу, получите желаемый результат. И так, в вашем коде

...
is_numeric = False
is_upper = False
is_lower = False
is_spec = False

... # ваша логика 

estimate = sum([is_numeric, is_upper, is_lower, is_spec]) + 1

И небольшой бонус, как провернуть ваши проверки через регулярные выражения

import re


password = input('Введите пароль: ')

if len(password) < 8:
    print('Минимальное количество символов 8')
    exit()

validate = {
    "is_numeric" : re.search(r"\d", password) is not None,
    "is_upper" : re.search(r"[A-Z]", password) is not None,
    "is_lower" : re.search(r"[a-z]", password) is not None,
    "is_spec" : re.search(r"[@#%&()$*?:;№!<>./,]", password) is not None
}

estimate = sum(validate.values()) + 1 

Относительно моего кода, рекомендации по паролю можно сделать таким образом

recommendations = {
    "is_numeric" : "добавить цифру",
    "is_upper" : "добавить большую букву",
    "is_lower" : "добавить маленькую букву",
    "is_spec" : "добавить спецсимвол",
}

if estimate < 5:
    result = "Рекомендации по паролю:\n"
    for key, value in validate.items():
        if not value:
            result += recommendations[key] + "\n"
    print(result)
→ Ссылка