我正在尝试构建一个密码生成器,它将为我提供由小写、大写、数字和特殊字符组成的密码。下面是我的密码。它生成所需长度的密码,但这些密码不包含每个组的字符。有人能帮我解释一下我做错了什么吗?
非常感谢。
import random
lower_case = list("abcdefghijklmnopqrstuvwxyz")
upper_case = list("abcdefghijklmnopqrstuvwxyz".upper())
num = []
for i in range(0, 10):
num.append(i)
s_letters = ["_", "@", "."]
available_char = lower_case + upper_case + num + s_letters
def set_password():
password_gen(length())
def length():
user_l = input("Please enter length of password. Minimum 6.\n")
try:
int(user_l) >= 6
except:
print("invalid number")
length()
return int(user_l)
def password_gen(x):
password = []
for i in range(x):
character = random.choice(available_char)
password.append(str(character))
set_a = set(password)
while True:
valid = True
if set_a & set(lower_case) == {}:
password_gen(x)
valid = False
if set_a & set(upper_case) == {}:
password_gen(x)
valid = False
if set_a & set(num) == {}:
password_gen(x)
valid = False
if set_a & set(s_letters) == {}:
password_gen(x)
valid = False
if valid:
print("Your password is " + "".join(password))
print(set_a & set(lower_case))
print(set_a & set(upper_case))
print(set_a & set(num))
print(set_a & set(s_letters))
break
set_password()
发布于 2020-05-10 06:27:07
length
没有给出数字为>=6
的保证,因为语句int(user_l) >= 6
不会引发异常,您可以使用assert int(user_l) >= 6
,而不是一次又一次地调用该方法,使用一个give循环def ():user_l = user_l =input(“请输入密码长度.最小6.\n"),而不是user_l.isdigit()或int(user_l) < 6: user_l=input(”请输入密码长度.最小6.\n")返回一个构建密码的方法,另一个方法来验证密码
def generate_pwd(长度):密码= []对于i在范围(长度):字符= random.choice(available_char) password.append(str(字符))返回密码
{}
是空的,而不是空的set
,也可以使用空set
的布尔值False
,并且使用elif
来避免做所有的事情。如果不是set_a &set_a,则是另一种更易读的方式:如果所有条件都为True,则密码有效
valid = set_a & set(ascii_lowercase)和set_a & set(ascii_uppercase)和\ set_a &set(位数)和set_a &set
以下是使用string
内置字母表的完整代码
import random
from string import ascii_lowercase, ascii_uppercase, digits
s_letters = ["_", "@", "."]
available_char = list(ascii_lowercase) + list(ascii_uppercase) + list(digits) + s_letters
def set_password():
password_gen(length())
def length():
user_l = input("Please enter length of password. Minimum 6.\n")
while not user_l.isdigit() or int(user_l) < 6:
user_l = input("Please enter length of password. Minimum 6.\n")
return int(user_l)
def generate_pwd(length):
return [str(random.choice(available_char)) for i in range(length)]
def password_gen(length):
valid = False
password = []
set_a = set()
while not valid:
password = generate_pwd(length)
set_a = set(password)
valid = set_a & set(ascii_lowercase) and set_a & set(ascii_uppercase) and \
set_a & set(digits) and set_a & set(s_letters)
print("Your password is " + "".join(password))
print(set_a & set(ascii_lowercase))
print(set_a & set(ascii_uppercase))
print(set_a & set(digits))
print(set_a & set(s_letters))
发布于 2020-05-10 06:23:31
也许您可以创建与每个字符类型对应的另一个键列表(例如,char_type = [“number”, “special”, “lowercase”, “uppercase”]
)。然后,在从其中一个列表中选择一个随机项之前,可以从“char_type”列表中随机选择一个项。当您接近所需的长度时,您可以进行适当的检查,以确保如果字符串中还不存在所需的类型,则在命中所需的字符长度之前将添加该类型。
就像这样:
import random
character_types = {}
character_types["lower_case"] = list("abcdefghijklmnopqrstuvwxyz")
character_types["upper_case"] = [char.upper() for char in character_types["lower_case"]]
character_types["num"] = [str(i) for i in range(0, 10)]
character_types["s_letters"] = ["_", "@", "."]
character_types["types"] = [key for key in character_types.keys()]
# available_char = lower_case + upper_case + num + s_letters
def set_password():
password_gen(length())
def length():
user_l = input("Please enter length of password. Minimum 6.\n")
if not int(user_l) >= 6:
print("invalid number")
length()
return int(user_l)
def password_gen(x):
password = []
password_types = set()
required_types = 4
for i in range(x):
char_type = random.choice(character_types["types"])
if x - len(password) <= 4:
if "s_letters" not in password_types:
char_type = "s_letters"
elif "lower_case" not in password_types:
char_type = "lower_case"
elif "upper_case" not in password_types:
char_type = "upper_case"
elif "num" not in password_types:
char_type = "num"
character = random.choice(character_types[char_type])
password_types.add(char_type)
password.append(character)
set_a = set(password)
# while True:
# valid = True
# if set_a & set(lower_case) == {}:
# password_gen(x)
# valid = False
# if set_a & set(upper_case) == {}:
# password_gen(x)
# valid = False
# if set_a & set(num) == {}:
# password_gen(x)
# valid = False
# if set_a & set(s_letters) == {}:
# password_gen(x)
# valid = False
# if valid:
print("Your password is " + "".join(password))
print(set_a & set(character_types["lower_case"]))
print(set_a & set(character_types["upper_case"]))
print(set_a & set(character_types["num"])) # This was initially not working because num did not consist of strings, whereas the password did.
print(set_a & set(character_types["s_letters"]))
# break
set_password()
没有必要进行最终检查,因为规则防止创建无效密码。这也阻止了我们反复生成密码,以便我们可以找到一个有效的密码。
@azro也正确地提到,您的长度检查并不妨碍某人选择长度小于6(固定在上面)。
您可以对上述代码进行改进。目前,当它检查以确保密码中存在所有必需的类型时,它是按照固定的顺序进行的。因此,它总是以相同的顺序追加缺少的字符类型(如果字符串中没有这些字符类型)。相反,您可以在每一步确定缺少哪些字符类型(维护一个"missing_types“或其他什么的列表),然后从列表中随机选择一个类型,然后根据所选类型随机选择一个字符。
https://stackoverflow.com/questions/61713327
复制相似问题