#python #python-3.x
#python #python-3.x
Вопрос:
Я пытался создать генератор паролей на python, используя модуль secrets. Сначала я спрашиваю у пользователя желаемую длину пароля, а затем выбираю случайным образом из 3 списков символов (букв, цифр, символов). Затем я печатаю результаты один за другим через цикл.
Моя проблема в том, что программа работает нормально, пока пользователь не запросит около 12 символов. Затем я получаю следующую ошибку IndexError: list index out of range
, и после нескольких часов поиска мне не удается найти ответ.
Извините, если вопрос кажется простым, но я все еще новичок и хочу только совершенствоваться!
Вот мой код :
import secrets
# importing modules
doRun = True
while doRun:
length = int(input("How many characters do you want you password to have ? "))
# Asking the user for the length of the password
letCar = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
"v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
"Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
# List for characters
numCar = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
# List for numbers
symCar = ["!", "@", "?"]
# List for symbols
password = []
# Initializing list for password
for i in range(0, length):
selector = secrets.randbelow(3)
# Randomly choosing from which list to pick
if selector == 0:
# Characters list
chosenCar = secrets.choice(letCar)
password.append(chosenCar)
letCar.remove(chosenCar)
elif selector == 1:
# Numbers list
chosenCar = secrets.choice(numCar)
password.append(chosenCar)
numCar.remove(chosenCar)
elif selector == 2:
# Symbols list
chosenCar = secrets.choice(symCar)
password.append(chosenCar)
symCar.remove(chosenCar)
print("password is : ", end="")
for i in range(len(password)):
print(password[i], end="")
print()
doRun = input("Again ? (Yes --> True // No --> False) : ")
Ошибки :
Traceback (most recent call last):
File "E:BureautiqueOutilsProgrammationPythonProjectsPWHashmain.py", line 35, in <module>
chosenCar = secrets.choice(symCar)
File "C:UsersArthurAppDataLocalProgramsPythonPython39librandom.py", line 347, in choice
return seq[self._randbelow(len(seq))]
IndexError: list index out of range
Спасибо за вашу помощь!
Комментарии:
1. Какое выбранное значение длины вызвало ошибку?
2. Он начинает выдавать ошибки, когда длина> = 10, но не каждый раз. Это то, что меня интригует, иногда он выводит результат, а иногда возвращает ошибку. Я также получаю ошибки для более низких значений, но, похоже, это встречается реже.
3. Закария прав. Кроме того, если вы пытаетесь генерировать пароли, вам лучше поместить все символы в один большой список, а не разделять его, а также не удалять какие-либо символы из списка. Лучшие пароли непредсказуемы: удаляя символы, вы упрощаете угадывание следующего символа (это не может быть ни один из символов, которые уже были в пароле) и помещая символы в разные списки, вы повышаете вероятность появления специальных символов, чем букв
4. Ну, вы удаляете элементы из списков случайным образом, так что это может привести к сбою через 4 раза, если вы удалите все элементы из symCar, но списки могут длиться дольше, если есть большая выборка из более длинного списка, такого как letCar.
5. Да, это, вероятно, сработает! Кроме того, спасибо за ваш совет, я изменю это, чтобы сделать программу более сильной и менее предсказуемой. В любом случае, программа не должна была использоваться ежедневно, но это была скорее идея проекта, которую я придумал, и я подумал, что было бы интересно сделать.
Ответ №1:
Я думаю, это потому, что вы удаляете элементы из списков автомобилей, так что, когда автомобиль выбирается достаточно раз, в случае symCars, строка, в которой ваша программа разбилась, всего 3, и тогда это пустой список, поэтому, если автомобиль выбран снова, в нем ничего нетсписок для поиска модуля secrets
Комментарии:
1. Действительно, это может исправить проблему, я не думал об этом случае! Я попытаюсь исправить это и свяжусь с вами позже. Большое вам спасибо!
Ответ №2:
Я не знаю, то ли это, что вы ищете, но именно так это сработало для меня
for i in range(0, length):
selector = secrets.randbelow(3)
# Randomly choosing from which list to pick
if selector == 0:
# Characters list
chosenCar = secrets.choice(letCar[i])
password.append(chosenCar)
letCar.remove(chosenCar)
elif selector == 1:
# Numbers list
chosenCar = secrets.choice(numCar[i])
password.append(chosenCar)
numCar.remove(chosenCar)
Ответ №3:
Проблема в том, что элемент из symCar удаляется каждый раз, когда из него выбирается элемент. После трех повторений список очищается. Чтобы устранить проблему, вы могли бы удалить строки .remove . Хотя это позволяет включить в ваш пароль несколько символов, это помогает сохранить его непредсказуемым.
Другой вариант — добавить способ пополнения списков после удаления всех их элементов. Пример этого показан ниже.
if symCar == []:
symCar = ["!", "@", "?"]
Ответ №4:
Проблема заключалась в том, что я удалил элемент из списков после его выбора. Иногда это приводило к созданию пустого списка, что приводило к ошибке. Я исправил это, создав большой список со всеми символами в нем, как предложил Мэтью, и я не удаляю выбранные символы из списка, чтобы сделать программу менее предсказуемой.
Недавно отредактированная программа — это :
import secrets
import random
# importing modules
doRun = True
while doRun:
length = int(input("How many characters do you want you password to have ? "))
# Asking the user for the length of the password
car = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
"v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
"Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "!",
"@", "?"]
# Characters list
password = []
# Initializing list for password
for i in range(0, length):
random.shuffle(car)
password.append(secrets.choice(car))
# Picking an item form the car list and appending it to the password list after a shuffle
print("password is : ", end="")
for i in range(len(password)):
print(password[i], end="")
print()
doRun = input("Again ? (Yes --> True // No --> False) : ")
Спасибо всем за вашу помощь!