Как настроить создание генератора паролей и спросить, какой длины должен быть пароль?

#python

#python

Вопрос:

Итак, я хочу написать код на Python, который создает случайный пароль для пользователя. Он должен спросить пользователя, какой длины они хотят, чтобы их пароль был, и иметь минимальный набор символов.

Я пытался что-то искать в течение многих недель, и я просто не могу это найти, так что извините, если это уже было решено.

Вот код, который у меня есть на данный момент, не знаю, какой еще фрагмент кода мне нужен и где я должен использовать, чтобы получить то, что я хочу.

 import random
import secrets
import string


# This variable includes numbers
digits = string.digits

# This variable includes uppercase and lowercase letters
letters = string.ascii_lowercase

# This variable includes symbols
symbols = "!#$%amp;'()* , -./:;<=>?@[]^_`{|}~"

password = ''.join(secrets.choice(digits   letters   symbols) for t in range(20))

def message():
    print("Hello, here is a password generator: ")
    print("Choose the length?")
    print(userGen())

def userGen():
    upper = int(input("How many letters you want? "))
    spec = int(input("How many symbols you want? "))
    num = int(input("How many numbers you want? "))
    return passGen(upper,spec,num)

def passGen(upper,spec,num):
    new_password = ""
    for i in range(upper):
        new_password  = random.choice(letters)
    for x in range(spec):
        new_password  = random.choice(symbols)
    for y in range(num):
        new_password  = random.choice(digits)

    pass_word = list(new_password)
    shuff = random.shuffle(pass_word)
    new_pass = "".join(pass_word)
    password = secrets.token_urlsafe(7)
    return new_pass


message()
  

Комментарии:

1. Итак, тогда, если они выбирают 3 буквы, 2 символа и 0 цифр, то какими должны быть оставшиеся 2 символа, чтобы соответствовать вашему минимуму из 7 символов? Это должны быть буквы, символы или цифры?

Ответ №1:

Измените свой userGen() следующим образом:

 def userGen():
    c = 0
    upper = int(input("How many letters you want? "))
    spec = int(input("How many symbols you want? "))
    num = int(input("How many numbers you want? "))
    c  = upper   num  spec
    if c < 7:
        print('Your password is too short.')
        userGen()
    else:
        return passGen(upper,spec,num)
  

Редактировать:

 import random
import string
import secrets

length = 7


# This variable includes numbers
digits = "1234567890"

# This variable includes uppercase and lowercase letters
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

# This variable includes symbols
symbols = "!#$%amp;'()* , -./:;<=>?@[]^_`{|}~"

password = ''.join(secrets.choice(digits   letters   symbols) for t in range(20))
def message():
    print("Hello, here is a password generator. ")
    print("Choose the length of your characters:")
    passGen()

def passGen():
    c = 0
    upper = int(input("How many letters you want? "))
    spec = int(input("How many symbols you want? "))
    num = int(input("How many numbers you want? "))
    c  = upper   num  spec
    if c < length:
        print('Your password is too short.')
        passGen()
    else:
        new_password = ""
        for i in range(upper):
            new_password  = random.choice(letters)
        for x in range(spec):
            new_password  = random.choice(symbols)
        for y in range(num):
            new_password  = random.choice(digits)

        pass_word = list(new_password)
        shuff = random.shuffle(pass_word)
        new_pass = "".join(pass_word)
        password = secrets.token_urlsafe(7)
        print(new_pass)

message()
  

Ответ №2:

Я полагаю, что то, чего вы пытаетесь достичь, может быть сделано с помощью простого if оператора (вот хороший ресурс). Вы хотите:

  • проверьте, вводит ли пользователь комбинацию, которая в сумме составляет до 7 символов
  • если это правда:
    • назначьте пароль так, как вы это делаете в данный момент
  • если это не так, у вас есть как минимум 2 варианта:
    • выведите сообщение об ошибке, подобное предложенному @Ktoto
    • заставьте пароль состоять не менее чем из 7 символов, самостоятельно установив количество букв, цифр и символов.

Ответ №3:

Вы можете использовать операторы if, подобные этому:

 def userGen():
    upper = int(input("How many letters you want? "))
    spec = int(input("How many symbols you want? "))
    num = int(input("How many numbers you want? "))
    if int(upper)   int(spec)   int(num) <= 7:
        # your code
    return passGen(upper, spec, num)
  

Затем добавьте больше символов к определенному типу символов, который вам нравится.

Ответ №4:

Вопрос не ясен, какие символы следует добавлять, если вариантов пользователя недостаточно, поэтому я предлагаю вам просто попросить пользователя повторить попытку, пока их не наберется достаточно.

Хотя это не совсем ответ на вопрос, вот предложение о некоторой общей очистке кода, которую вы могли бы сделать. Это включает в себя использование двух словарей: characters которые содержат типы символов, и choices который содержит выбор пользователя относительно количества элементов каждого типа. Если вы хотите что-то изменить, например, разделить ‘letters’ на отдельные значения для верхнего и нижнего регистра, тогда вам нужно будет изменить словарь вверху.

 import random

characters = {'digits': '1234567890',
              'letters': 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
              'symbols': "!#$%amp;'()* ,-./:;<=>?@[]^_`{|}~"}


def getChoices(min_total=7):
    print('Hello, here is a password generator: ')
    print('Choose the length of your characters?')
    while True:
        total = 0
        choices = {}
        for category in characters.keys():
            number = int(input(f'How many {category} do you want? '))
            choices[f'num_{category}'] = number
            total  = number
        if total >= min_total:
            return choices
        else:
            print(f'Need at least {min_total} characters - please try again')


def passGen(choices):
    new_password = ''
    for category, options in characters.items():
        for i in range(choices[f'num_{category}']):
            new_password  = random.choice(options)
    pass_word = list(new_password)
    random.shuffle(pass_word)
    new_pass = ''.join(pass_word)
    return new_pass


def main():
    choices = getChoices()
    print(f'Your choices: {choices}')
    password = passGen(choices)
    print(f'Your password: {password}')


main()
  

Комментарии:

1. Привет, спасибо, я вижу, что этот обновленный курс работает хорошо. Однако я обновил код и опубликовал его в комментариях с помощью другого метода, который кто-то здесь предоставил, и, похоже, он работает не так, как я хочу, в то время как ваш работает. Вы знаете почему? Это в другом комментарии, который я публикую к своему собственному ответу. Я просто хочу узнать, почему. Потому что, когда я пытаюсь запустить программу и выбираю пароль из более чем 7 символов, это работает. Но если я запускаю программу и пытаюсь использовать меньше 7, а затем снова с более чем 7, в результате я получаю «none».

2. @ErnesFernandez Похоже, что теперь вы спрашиваете об ответе Ktoto. Имейте в виду, что это может быть отредактировано в ближайшее время, но, похоже, они пытаются реализовать «повторную попытку», используя рекурсивный вызов той же функции. Это не сработает, так, как они его закодировали (хотя return passGen() вместо passGen() могло бы подойти.) Нет, вы действительно хотите использовать цикл здесь — обратите внимание на использование while . Это не та ситуация, когда рекурсия действительно помогает — как только вы посмотрите на некоторые примеры рекурсии из учебника, вы почувствуете, в какого рода ситуациях это может быть действительно полезно.