Top.Mail.Ru
Ответы

Тема: Программирование на python

Здравствуйте! Я написал код генератора паролей по шаблону на python. Хочу услышать мнение от программистов на python. Вот код:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
 from random import choice 
 
digits = "0123456789"  # цифры. 
vowel_lowercase_letters = "AEIOUY"  # Заглавные гласные буквы английского языка. 
vowel_uppercase_letters = "aeiouy"  # Строчные гласные буквы английского языка. 
consonant_lowercase_letters = "bcdfghjklmnpqrstvwxz"  # Строчные согласные буквы английского языка. 
consonant_uppercase_letters = "BCDFGHJKLMNPQRSTVWXZ"  # Заглавные согласные буквы английского языка. 
punctuation = "#$&@_"  # Специальные символы. 
list_password = []  # набор паролей. 
 
# Цикл будет работать пока пользователь не введёт шаблон правильно. 
while True: 
    sample_password = input("Введите шаблон для генерации пароля: ") 
    for letter in sample_password: 
        if letter.isalpha() and letter.lower() not in "aeiouybcdfghjklmnpqrstvwxz": 
            print("\nВ вашем шаблоне должны быть только английские буквы!") 
            break 
    else: 
        break 
 
 
# Функция для возвращения символа по шаблону. 
def check_symbol(letter_func): 
    if letter_func in consonant_lowercase_letters: 
        return choice(consonant_lowercase_letters) 
    elif letter_func in consonant_uppercase_letters: 
        return choice(consonant_uppercase_letters) 
    elif letter_func in vowel_lowercase_letters: 
        return choice(vowel_lowercase_letters) 
    elif letter_func in vowel_uppercase_letters: 
        return choice(vowel_uppercase_letters) 
    elif letter_func in digits: 
        return choice(digits) 
    elif letter_func in punctuation: 
        return choice(punctuation) 
    else: 
        return letter_func 
 
 
# Функция для вычисления сколько получиться сгенерированных паролей. 
def check_count_password(samply_password_func): 
    if (len(samply_password_func) == 1 and (samply_password_func not in vowel_uppercase_letters + punctuation + 
       vowel_lowercase_letters + consonant_lowercase_letters + consonant_uppercase_letters + digits)): 
        return ["Из-за шаблона вашего пароля получилось сгенерировать только 1 новый!:", 1] 
    elif (len(samply_password_func) == 1 and (samply_password_func not in vowel_uppercase_letters + 
          vowel_lowercase_letters + consonant_lowercase_letters + consonant_uppercase_letters + digits)): 
        return ["Из-за шаблона вашего пароля получилось сгенерировать только 4 новых!:", 4] 
    else: 
        return ["Пароли:", 10] 
 
 
# Главный цикл. 
while True: 
    password = "" 
 
    # Создание пароля. 
    for letter in sample_password: 
        password += check_symbol(letter) 
 
    # Если такой пароль не был сгенерирован он будет добавляться в список . 
    if password not in list_password: 
        list_password.append(password) 
 
    # Если сгенерированных паролей достаточно мы будем выходить из цикла. 
    if len(list_password) == check_count_password(sample_password)[1]: 
        print(f"\n{check_count_password(sample_password)[0]}") 
        break 
 
print(*list_password, sep="\n") 
 
По дате
По рейтингу
Аватар пользователя
Мудрец
9мес

я конечно не киберпрогер, но вроде норм

Аватар пользователя
Профи
8мес

Ваш код представляет собой программу для генерации паролей на основе заданного шаблона. Давайте рассмотрим его структуру и функциональность

Плюсы:
Модульность: Код хорошо структурирован, использует функции для выполнения различных задач (проверка символов, подсчет количества паролей).

Валидация ввода: Выполняется проверка на корректность ввода шаблона, чтобы убедиться, что он содержит только английские буквы.

Генерация паролей: Пароли генерируются на основе шаблона, и программа проверяет, чтобы все сгенерированные пароли были уникальными.

Минусы и возможные улучшения:
Дублирование кода: В функции check_count_password есть дублирование логики. Это можно упростить, используя более общий подход.

Неочевидные условия: Условия в check_count_password могут быть неочевидными для других разработчиков. Лучше добавить комментарии или переписать их более понятным образом.

Ограниченная гибкость: Количество генерируемых паролей жестко закодировано в функции check_count_password. Можно сделать это значение параметризуемым.

Обработка ошибок: В случае некорректного ввода шаблона программа просто выводит сообщение и просит ввести его заново. Можно добавить более информативное сообщение об ошибке.

Использование break: Использование break в цикле while True может быть заменено на более явное условие выхода из цикла.

Аватар пользователя
Просветленный
9мес

Код нормальный, но я уверен что есть готовые решения. Велосипед это плохая практика

Аватар пользователя
Ученик
6мес

Прикольно

Аватар пользователя
Профи
6мес
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
 from random import choice 
 
digits = "0123456789" 
vowel_lowercase_letters = "aeiouy" 
vowel_uppercase_letters = "AEIOUY" 
consonant_lowercase_letters = "bcdfghjklmnpqrstvwxz" 
consonant_uppercase_letters = "BCDFGHJKLMNPQRSTVWXZ" 
punctuation = "#$&@_" 
 
list_password = []  # Набор паролей 
 
# Функция для возвращения символа по шаблону 
def check_symbol(letter_func): 
    if letter_func in consonant_lowercase_letters: 
        return choice(consonant_lowercase_letters) 
    elif letter_func in consonant_uppercase_letters: 
        return choice(consonant_uppercase_letters) 
    elif letter_func in vowel_lowercase_letters: 
        return choice(vowel_lowercase_letters) 
    elif letter_func in vowel_uppercase_letters: 
        return choice(vowel_uppercase_letters) 
    elif letter_func in digits: 
        return choice(digits) 
    elif letter_func in punctuation: 
        return choice(punctuation) 
    else: 
        return letter_func 
 
# Функция для вычисления количества сгенерированных паролей 
def check_count_password(sample_password_func): 
    unique_characters = len(set(sample_password_func))  # Получаем количество уникальных символов 
    if unique_characters == 1: 
        return ["Из-за шаблона вашего пароля получилось сгенерировать только 1 новый пароль:", 1] 
    elif unique_characters == 2: 
        return ["Из-за шаблона вашего пароля получилось сгенерировать только 4 новых пароля:", 4] 
    else: 
        return ["Пароли:", 10] 
 
# Цикл, который будет работать пока пользователь не введет шаблон правильно 
while True: 
    sample_password = input("Введите шаблон для генерации пароля: ") 
 
    # Проверяем, что все символы шаблона валидны (буквы, цифры или спецсимволы) 
    valid = True 
    for letter in sample_password: 
        if letter not in (digits + vowel_lowercase_letters + vowel_uppercase_letters + consonant_lowercase_letters + consonant_uppercase_letters + punctuation): 
            print("\nВ вашем шаблоне есть недопустимые символы!") 
            valid = False 
            break 
     
    if valid: 
        break 
 
# Главный цикл генерации паролей 
while len(list_password) < check_count_password(sample_password)[1]: 
    password = "" 
    for letter in sample_password: 
        password += check_symbol(letter) 
 
    if password not in list_password: 
        list_password.append(password) 
 
print(f"\n{check_count_password(sample_password)[0]}") 
print(*list_password, sep="\n")