You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:35:22