Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

RU_kesTOP Ученик (115), на голосовании 1 месяц назад
Здравствуйте! Я написал код генератора паролей по шаблону на 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")
Голосование за лучший ответ
робот д24 Мудрец (19785) 2 месяца назад
Код нормальный, но я уверен что есть готовые решения. Велосипед это плохая практика
ПлюсикУченик (145) 2 месяца назад
Велосипед это отличная практика и полноценное изучение темы
А не копипаста как ты любишь, с нулевыми знаниями в голове и минимумом усилий.
Ты же ге кодишь, ты просто копируешь
робот д24 Мудрец (19785) Плюсик, для изучения может нормальная. Но для работы нет
RU_kesTOPУченик (115) 2 месяца назад
Рад, что на моём вопросе такое обсуждение :)
Виолетта Сыр⛰️ Мудрец (14935) 2 месяца назад
я конечно не киберпрогер, но вроде норм
RU_kesTOPУченик (115) 2 месяца назад
Спасибо :)
bobik Гуру (3048) 2 месяца назад
как же много if, elif. По коду можно сказать, что его написал откровенно не профессионал. 100% его можно оформить элегантнее не влезая if-else hell
RU_kesTOPУченик (115) 2 месяца назад
Да, я не профессионал. Недавно только изучил функции. Этот код был написан для закрепления изученного. Все равно спасибо за ответ :)
Константин Бельков Гуру (3924) 2 месяца назад
вроде все норм. ну if очень много
RU_kesTOPУченик (115) 2 месяца назад
Я не понимаю, как можно их заменить? Использовать, какую-нибудь библиотеку?
Константин Бельков Гуру (3924) RU_kesTOP, Улучшение Python кода: замените if-elif условие на словарь!
Celtic Hammer Мудрец (16560) 2 месяца назад
И эта длиннющая простыня - генератор паролей? О_о
Весь генератор паролей умещается в несколько строк. Он к тому же генерирует криптоустойчивые пароли
 import string as st   
import secrets as sc

all_ = ''.join([i for i in st.printable if not i in st.whitespace])

def result(chars,length):
return ''.join(sc.choice(chars) for _ in range(length))

print(result(all_,int(input('длина пароля '))))
Юрий Семыкин Искусственный Интеллект (205633) 2 месяца назад
У вас много лишнего (и ненадёжного поэтому). Все классы символов есть уже в модуле string Посмотрите https://ru.linux-console.net/?p=5912
Dfhujbfrykvvg Ученик (127) 2 месяца назад
Х**ня, сделай без многократного использования if/elif , и без модуля рандом , тут все модуль исполняет , а ты просто пользуешься его api , сделай модуль рандом самостоятельно
Рустам Абдрашитов Мастер (1375) 2 месяца назад
 from random import choice 

# Constants for character sets
DIGITS = "0123456789"
VOWEL_LOWERCASE = "aeiouy"
VOWEL_UPPERCASE = "AEIOUY"
CONSONANT_LOWERCASE = "bcdfghjklmnpqrstvwxz"
CONSONANT_UPPERCASE = "BCDFGHJKLMNPQRSTVWXZ"
PUNCTUATION = "#$&@_"

# Function to validate the input pattern
def validate_pattern(pattern):
valid_chars = VOWEL_LOWERCASE + VOWEL_UPPERCASE + CONSONANT_LOWERCASE + CONSONANT_UPPERCASE + DIGITS + PUNCTUATION
if all(char in valid_chars for char in pattern):
return True
return False

# Function to generate a password based on a given template
def generate_password(template):
password = ""
for char in template:
if char in CONSONANT_LOWERCASE:
password += choice(CONSONANT_LOWERCASE)
elif char in CONSONANT_UPPERCASE:
password += choice(CONSONANT_UPPERCASE)
elif char in VOWEL_LOWERCASE:
password += choice(VOWEL_LOWERCASE)
elif char in VOWEL_UPPERCASE:
password += choice(VOWEL_UPPERCASE)
elif char in DIGITS:
password += choice(DIGITS)
elif char in PUNCTUATION:
password += choice(PUNCTUATION)
else:
password += char # If it's an unsupported character, keep it as is
return password

# Main function to run the password generator
def main():
list_passwords = set() # Use a set to avoid duplicates

while True:
sample_password = input("Введите шаблон для генерации пароля: ")

if validate_pattern(sample_password):
break
else:
print("\nВ вашем шаблоне должны быть только английские буквы, цифры или специальные символы (#$&@_).")

# Generate passwords until we reach the desired count
desired_count = 10 # You can change this to any number you want
while len(list_passwords) < desired_count:
new_password = generate_password(sample_password)
list_passwords.add(new_password)

print(f"\nСгенерированные пароли ({len(list_passwords)}):")
print(*list_passwords, sep="\n")

if __name__ == "__main__":
main()
Рустам АбдрашитовМастер (1375) 2 месяца назад
Лучше такой
Timur Magerramov Профи (616) 2 месяца назад
За что..
 import string, random

p = ""

for I in range(10):

p += random.choice(string.ascii_letters)
print(p)
Валентин Артамонов Профи (595) 1 месяц назад
Ваш код представляет собой программу для генерации паролей на основе заданного шаблона. Давайте рассмотрим его структуру и функциональность

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

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

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

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

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

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

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

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