Python密码生成器优化需求:实现用户可选是否包含标点符号
密码生成器(添加标点选择功能)
修改后的完整代码
import string import random # 定义可用字符集 s1 = list(string.ascii_lowercase) s2 = list(string.ascii_uppercase) s3 = list(string.digits) s4 = list(string.punctuation) # 获取密码长度输入 characters_number = input("请输入密码长度(至少6位): ") # 验证密码长度输入合法性 while True: try: characters_number = int(characters_number) if characters_number < 6 : print("密码长度至少需要6位") characters_number = input("请重新输入: ") else: break except ValueError: print("请输入有效数字") characters_number = input("请重新输入密码长度: ") # 获取是否包含标点的选择 include_punct = input("是否在密码中包含标点符号?(y/n): ").strip().lower() while include_punct not in ['y', 'n']: print("请输入y或n") include_punct = input("是否包含标点符号?(y/n): ").strip().lower() # 打乱字符集顺序 random.shuffle(s1) random.shuffle(s2) random.shuffle(s3) random.shuffle(s4) password = [] if include_punct == 'y': # 包含标点的情况:字母占60%,数字+标点各占20% part1 = round(characters_number * 0.3) # 小写+大写各占30%,合计60% part2 = round(characters_number * 0.2) # 数字+标点各占20%,合计40% for x in range(part1): password.append(s1[x]) password.append(s2[x]) for x in range(part2): password.append(s3[x]) password.append(s4[x]) else: # 不包含标点的情况:字母占60%,数字占40% part1 = round(characters_number * 0.3) part2 = round(characters_number * 0.4) # 数字占40% for x in range(part1): password.append(s1[x]) password.append(s2[x]) for x in range(part2): password.append(s3[x]) # 确保密码长度刚好符合要求(round可能导致总长度偏差) if len(password) > characters_number: password = password[:characters_number] elif len(password) < characters_number: # 不足部分随机从可用字符中补充 remaining = characters_number - len(password) available_chars = s1 + s2 + s3 if include_punct == 'n' else s1 + s2 + s3 + s4 random.shuffle(available_chars) password.extend(available_chars[:remaining]) # 再次打乱密码顺序,避免固定规律 random.shuffle(password) # 转换为字符串并输出 password_str = "".join(password) print(f"生成的密码: {password_str}")
关键改动说明
- 新增标点选择流程:添加用户输入环节让用户选择是否包含标点,同时通过循环确保输入仅为
y或n,避免无效输入。 - 动态调整字符分配:
- 选择包含标点时,沿用原比例:字母占60%,数字和标点各占20%。
- 选择不包含标点时,将原分配给标点的20%份额全部转移给数字,保证总字符数匹配用户需求。
- 修复长度偏差问题:由于
round()函数可能导致各部分字符数总和与目标长度有出入,新增补全/截断逻辑,确保最终密码长度完全符合要求。 - 提升随机性:生成密码列表后再次打乱顺序,避免出现“小写→大写→数字→标点”的固定排列规律。
- 清理冗余代码:删除了无用的
from msilib import change_sequence导入语句。
内容的提问来源于stack exchange,提问作者BILAL BSA
相关产品推荐
相关产品推荐

