Как указать переменные с помощью random в Python

#python #python-3.x #random

#python #python-3.x #Случайный

Вопрос:

Я создаю генератор паролей, который принимает длину желаемого пароля, количество букв, а также количество цифр. Пароль должен содержать прописные буквы, а также цифры и специальные символы. У меня возникли проблемы с определением того, как указать количество букв и цифр в пароле. Это то, что у меня есть до сих пор:

 import random

charslet ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
charsnum = "1234567890"
charssym = "!@#$%^amp;*"

def password():
    pwd = ""

    passlen = int(input("How long do you want the password to be?: "))
    passlet = int(input("How many letters do you want in your password?: "))
    passnum = int(input("How many numbers do you want in your password?: "))
    passsym = int(passlen - (passlet   passnum))
    chars = ""

    for let in range(passlet):
        chars  = random.choice(charslet)
    for num in range(passnum):
        chars  = random.choice(charsnum)
    for sym in range(passsym):
        chars  = random.choice(charssym)



    for p in range(passlen):
        pwd  = random.choice(chars)

    print(pwd)

password()

  

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

1. Для начала, не давайте вашей функции и локальной переменной одно и то же имя. И похоже, что вы указали оба числа. Пожалуйста, уточните свой вопрос.

2. Спасибо, я только что изменил его на pwd . И когда я запускаю программу и ввожу свои переменные, выведенный пароль не соответствует критериям, которые у меня были. например, я ставлю 10 для passlen , 3 для passlet и 3 для passnum . Итак, теоретически я должен получить пароль из 3 букв, 3 цифр и 4 символов, но я получил 4 # # amp; $ * c40 # в качестве выходных данных.

3. Здесь вы можете использовать идиому Python: когда вы выполняете for цикл, и вам не важны значения из, range() вы можете использовать один символ подчеркивания в качестве имени переменной: _ ваш код использует let , num , и sym в качестве имен переменных для значений цикла, но вашему коду никогда не нужноиспользуйте их для чего угодно. Это не так, но использование _ идиомы почти похоже на добавление комментария, в котором говорится: «Нас не волнует значение цикла здесь, мы просто хотим выполнить цикл определенное количество раз».

Ответ №1:

Я думаю, что последняя часть — это то, что вас смущает. Вы создаете chars переменную с правильным количеством определенных символов, но затем снова выбираете между ними в конце.

Вы могли бы просто изменить:

 for p in range(passlen):
    password  = random.choice(chars)
  

С помощью

 # option 1 - works better if working with lists
list_chars = list(chars)
random.shuffle(chars)
password = "".join(list_chars)

# option 2 - simpler solution for strings
password = "".join(random.sample(char, len(char)))
  

Вы также можете использовать shuffle для выбора символов раньше без циклов for, что-то вроде:

 # for this to work your `charslet` must be a list
random.shuffle(charslet)
chars  = "".join(charslet[:passlet])
  

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

1. Я последовал вашему первому предложению, но, в свою очередь, получил TypeError: объект ‘str’ не поддерживает назначение элемента

2. Я исправил код, shuffle не работает со строками, вам нужно использовать списки, поэтому в этом случае я преобразовал текущую строку в список и объединил ее обратно в строку после перетасовки. Теперь это должно сработать.

3. включена новая опция, использующая random.sample

4. Большое вам спасибо, я изменил перетасовку строк в список, как вы сказали, и это работает просто отлично.

Ответ №2:

Это исправленный код:

     import random

    charslet ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    charsnum = "1234567890"
    charssym = "!@#$%^amp;*"

    def password():
        pwd = ""

        passlen = int(input("How long do you want the password to be?: "))
        passlet = int(input("How many letters do you want in your password?: "))
        passnum = int(input("How many numbers do you want in your password?: "))
        passsym = int(passlen - (passlet   passnum))
        chars = ""

        for let in range(passlet):
            chars  = random.choice(charslet)
        for num in range(passnum):
            chars  = random.choice(charsnum)
        for sym in range(passsym):
            chars  = random.choice(charssym)



        list_chars = list(chars)
        random.shuffle(list_chars)
        pwd = "".join(list_chars)

        print(pwd)

    password()
  

Я заменил:

     for p in range(passlen):
        password  = random.choice(chars)
  

с помощью

     list_chars = list(chars)
    random.shuffle(list_chars)
    pwd = "".join(list_chars)
  

Помещение измененной chars переменной в список позволило мне перетасовать ее, рандомизировать и назначить ее pwd