Генератор паролей на python
Не так давно стал изучать python и сейчас пытаюсь сделать первый пет-проект как генератор паролей. Основную функцию выполняет хорошо, но развить его дальше не могу. Мне нужно, чтобы изначально был выбор: сделать пароль автоматически, либо самостоятельно указывать необходимые регистры(цифры, буквы заглавные/прописные, спец. символы). Изначально делал на обычных if, сейчас пробую реализовать через for, но что-то делаю неверно и в итоге приходится постоянно лично указывать используемые символы.
from random import choice
digits = '0123456789'
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lowercase = 'abcdefghijklmnopqrstuvwxyz'
punctuation = '!#$%&*+-=?@^_'
ally = digits + uppercase + lowercase + punctuation
chars = ''
pwd_pass = ['pwd_auto', 'pwd_digits', 'pwd_uppercase', 'pwd_lowercase', 'pwd_punctuation']
pwd_length = int(input('Введите желаемую длину пароля: '))
pwd_auto = input('Сгенерировать пароль автоматически? (y, n): ')
pwd_digits = input('Включить цифры (y, n): ')
pwd_uppercase = input('Включить uppercase (y, n): ')
pwd_lowercase = input('Включить цифры (y, n): ')
pwd_punctuation = input('Включить спец. символы (y, n): ')
for i in pwd_pass:
if pwd_auto == 'y':
chars += ally
break
else:
if pwd_digits == 'y':
chars += digits
if pwd_uppercase == 'y':
chars += uppercase
if pwd_lowercase == 'y':
chars += lowercase
if pwd_punctuation == 'y':
chars += punctuation
password = ''
for i in range(pwd_length):
password += choice(chars)
print('\n', password, '\n', sep='')
Ответы (1 шт):
Вcего лишь переставил строчки в вашем коде:
from random import choice
digits = '0123456789'
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lowercase = 'abcdefghijklmnopqrstuvwxyz'
punctuation = '!#$%&*+-=?@^_'
ally = digits + uppercase + lowercase + punctuation
chars = ''
pwd_length = int(input('Введите желаемую длину пароля: '))
pwd_auto = input('Сгенерировать пароль автоматически? (y, n): ')
if pwd_auto == 'y':
chars += ally
else:
pwd_digits = input('Включить цифры (y, n): ')
pwd_uppercase = input('Включить uppercase (y, n): ')
pwd_lowercase = input('Включить lowercase (y, n): ')
pwd_punctuation = input('Включить спец. символы (y, n): ')
if pwd_digits == 'y':
chars += digits
if pwd_uppercase == 'y':
chars += uppercase
if pwd_lowercase == 'y':
chars += lowercase
if pwd_punctuation == 'y':
chars += punctuation
password = ''
for i in range(pwd_length):
password += choice(chars)
print('\n', password, '\n', sep='')
Потому что зачем спрашивать сразу всё вначале, если в случае автоматической генерации кучу вопросов и задавать даже не надо.
Через цикл можно организовать вопросы.
from random import choices
digits = '0123456789'
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lowercase = 'abcdefghijklmnopqrstuvwxyz'
punctuation = '!#$%&*+-=?@^_'
chars = ''
pwd_length = int(input('Введите желаемую длину пароля: '))
pwd_auto = (input('Сгенерировать пароль автоматически? (y, n): ') == 'y')
for text, seq in (('Включить цифры', digits ),
('Включить uppercase', uppercase ),
('Включить lowercase', lowercase ),
('Включить спец. символы', punctuation)):
if pwd_auto or (input(text + ' (y, n): ') == 'y'):
chars += seq
password = ''.join(choices(chars, k=pwd_length))
print('\n', password, '\n', sep='')