Тема: Программирование на python
Здравствуйте! Я написал код генератора паролей по шаблону на python. Хочу услышать мнение от программистов на python. Вот код:
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")
я конечно не киберпрогер, но вроде норм
Ваш код представляет собой программу для генерации паролей на основе заданного шаблона. Давайте рассмотрим его структуру и функциональность
Плюсы:
Модульность: Код хорошо структурирован, использует функции для выполнения различных задач (проверка символов, подсчет количества паролей).
Валидация ввода: Выполняется проверка на корректность ввода шаблона, чтобы убедиться, что он содержит только английские буквы.
Генерация паролей: Пароли генерируются на основе шаблона, и программа проверяет, чтобы все сгенерированные пароли были уникальными.
Минусы и возможные улучшения:
Дублирование кода: В функции check_count_password есть дублирование логики. Это можно упростить, используя более общий подход.
Неочевидные условия: Условия в check_count_password могут быть неочевидными для других разработчиков. Лучше добавить комментарии или переписать их более понятным образом.
Ограниченная гибкость: Количество генерируемых паролей жестко закодировано в функции check_count_password. Можно сделать это значение параметризуемым.
Обработка ошибок: В случае некорректного ввода шаблона программа просто выводит сообщение и просит ввести его заново. Можно добавить более информативное сообщение об ошибке.
Использование break: Использование break в цикле while True может быть заменено на более явное условие выхода из цикла.
Код нормальный, но я уверен что есть готовые решения. Велосипед это плохая практика
Прикольно
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")