#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