Я пытаюсь создать программу-генератор паролей, в которой пользователь может выбрать, например, 8 специальных символов, 5 заглавных букв и 10 строчных букв для создания пароля. Таким образом, в приведенном выше примере пароль будет состоять из 23 символов с 8 специальными символами, 5 заглавными буквами и 10 строчными буквами. У меня есть ввод, но я не уверен, как заставить программу знать, что, например, 8 специальных символов будут 8 случайными символами, например, из string.punctuation
.
Это пример кода того, как я прошу пользователя ввести данные.
while True:
try:
lower = list(string.ascii_lowercase)
lower_low = 6
lower_high = 24
lower_choice = int(input("How many lower case letters would you like in your password? "))
if lower_choice<lower_low or lower_choice>lower_high:
print("The selection must be" ,lower_low,"or higher or", lower_high,"and lower. Please choose again. ")
continue
break
except ValueError:
print("Invalid input. Please try again.")
print("You have choosen", lower_choice,"lowercase letters to be used in your password.")
Я попытался создать функцию, подобную приведенной ниже, чтобы посмотреть, будет ли она принимать вводимые пользователем данные и сопоставлять число, например, с string.punctuation
, а затем создавать случайный выбор на основе этого, но я ошибаюсь.
def password_gen():
special = (string.punctuation)
lower_choice = (string.ascii_lowercase)
upper_choice = (string.ascii_uppercase)
password = ''
for p in range(38):
password += random.choice(special+lower_choice+upper_choice)
return password
password = password_gen
print(password)
Куда мне следует обратить внимание в первую очередь, чтобы указать правильное направление?
import string
import random
def get_user_input(prompt, min_value, max_value):
while True:
try:
value = int(input(prompt))
if min_value <= value <= max_value:
return value
print(f"Please choose a number between {min_value} and {max_value}.")
except ValueError:
print("Invalid input. Please enter a number.")
def generate_password(lower_count, upper_count, special_count):
lower = ''.join(random.choices(string.ascii_lowercase, k=lower_count))
upper = ''.join(random.choices(string.ascii_uppercase, k=upper_count))
special = ''.join(random.choices(string.punctuation, k=special_count))
# Combine all characters and shuffle
all_chars = list(lower + upper + special)
random.shuffle(all_chars)
return ''.join(all_chars)
def main():
print("Welcome to the Password Generator!")
lower_count = get_user_input("How many lowercase letters should be in the password? (1-20): ", 1, 20)
upper_count = get_user_input("How many uppercase letters should be in the password? (1-20): ", 1, 20)
special_count = get_user_input("How many special characters should be in the password? (1-10): ", 1, 10)
password = generate_password(lower_count, upper_count, special_count)
print(f"\nYour generated password: {password}")
print(f"Password length: {len(password)} characters")
if __name__ == "__main__":
main()
Мы используем random.choices(string.punctuation, k=special_count)
, чтобы выбрать точное количество специальных символов из string.punctuation
.
Точно так же мы используем random.choices(string.ascii_lowercase, k=lower_count)
и random.choices(string.ascii_uppercase, k=upper_count)
для строчных и прописных букв соответственно.
После генерации символов мы объединяем их все и используем random.shuffle()
, чтобы смешать их, чтобы пароль не имел предсказуемого шаблона.
Почему список туда-сюда -> строки -> список??
Эффективность: генерация символов отдельно для каждого типа (строчные, прописные, специальные) обеспечивает точное количество символов каждого типа. Перетасовка: вам нужно использовать список для рандомизации порядка символов в пароле, поскольку строки в Python неизменяемы. Окончательный формат: пароль возвращается в виде строки, поскольку это более удобный формат. Хотя исходный код работает корректно, его можно немного оптимизировать, уменьшив количество преобразований между списками и строками.
Повторите один раз для каждого типа символов, который запросил пользователь, повторяя столько раз, сколько он запросил. Сохранение
random.choice
в строку или список. Не делайте этогоreturn
, пока не закончится весь цикл. Возврат в цикле приведет к немедленному завершению функции на первой итерации.