我一直在尝试使用secrets模块在python中创建一个密码生成器。 我首先询问用户所需的密码长度,然后在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:\Bureautique\Outils\Programmation\Python\Projects\PWHash\main.py", line 35, in <module>
chosenCar = secrets.choice(symCar)
File "C:\Users\Arthur\AppData\Local\Programs\Python\Python39\lib\random.py", line 347, in choice
return seq[self._randbelow(len(seq))]
IndexError: list index out of range
谢谢你的帮助
我认为这是因为您正在从汽车列表中删除项目,因此当一辆汽车被选择足够多次时,在symCars的情况下,您的程序崩溃的行只有3次,然后它是一个空列表,因此如果再次选择汽车,则列表中没有任何内容可供机密模块查找
我不知道这是否是你想要的,但这就是我的工作方式
问题是每次从symCar中选择一个项目时,都会删除该项目。这会在重复三次后清空列表。要解决此问题,可以删除。删除行。虽然这允许在密码中包含多个单个字符,但这有助于保持密码的不可预测性
另一个选择是添加一种方式,让列表在其所有项目被删除后重新填充。下面是一个例子
相关问题 更多 >
编程相关推荐