Наличие генератора паролей использует пользовательский ввод для генерации пароля с заданными параметрами

Я пытаюсь создать программу-генератор паролей, в которой пользователь может выбрать, например, 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)

Куда мне следует обратить внимание в первую очередь, чтобы указать правильное направление?

Повторите один раз для каждого типа символов, который запросил пользователь, повторяя столько раз, сколько он запросил. Сохранение random.choice в строку или список. Не делайте этого return, пока не закончится весь цикл. Возврат в цикле приведет к немедленному завершению функции на первой итерации.

JNevill 02.07.2024 15:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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(), чтобы смешать их, чтобы пароль не имел предсказуемого шаблона.

Почему список туда-сюда -> строки -> список??

Thierry Lathuille 03.07.2024 18:48

Эффективность: генерация символов отдельно для каждого типа (строчные, прописные, специальные) обеспечивает точное количество символов каждого типа. Перетасовка: вам нужно использовать список для рандомизации порядка символов в пароле, поскольку строки в Python неизменяемы. Окончательный формат: пароль возвращается в виде строки, поскольку это более удобный формат. Хотя исходный код работает корректно, его можно немного оптимизировать, уменьшив количество преобразований между списками и строками.

sLoNcE 03.07.2024 18:53

Другие вопросы по теме