Python密码生成器问题:password数组无值及简化多分支判断
问题解决:密码生成器的两个核心问题
一、为什么password数组为空?
你遇到的第一个问题是典型的输入类型不匹配!input()函数返回的是字符串类型,但你定义的password_strength数组里的元素是整数。比如用户输入"1",你拿字符串"1"和整数1做比较,结果肯定是False,导致第一个if分支根本不会执行,password数组自然是空的。
解决方法很简单,把用户输入转换成整数即可:
user_choice = int(input("Enter desired password strength (1-5) : "))
👉 额外提示:最好加个输入验证,防止用户输入非数字或超出范围的内容,比如用try-except做异常捕获:
while True: try: user_choice = int(input("Enter desired password strength (1-5) : ")) if 1 <= user_choice <=5: break else: print("请输入1-5之间的数字!") except ValueError: print("请输入有效的数字!")
二、如何避免多个if分支?
用字典映射替代一堆if分支是最优雅的方案!我们可以把每个强度对应的规则(比如密码长度、可用字符集)存在字典里,直接根据用户选择的强度取对应配置生成密码,代码会更简洁易维护。
优化后的完整代码:
import string import random def password_generator(): # 定义每个强度对应的配置:密码长度 + 可用字符集 strength_config = { 1: {"length": 4, "chars": string.ascii_letters}, 2: {"length": 6, "chars": string.ascii_letters + string.digits}, 3: {"length": 8, "chars": string.ascii_letters + string.digits + string.punctuation}, 4: {"length": 10, "chars": string.ascii_letters + string.digits + string.punctuation + string.whitespace}, 5: {"length": 12, "chars": string.printable} } # 输入验证逻辑 while True: try: user_choice = int(input("Enter desired password strength (1-5) : ")) if user_choice in strength_config: break print("请输入1-5之间的数字!") except ValueError: print("请输入有效的数字!") # 获取对应强度的配置并生成密码 config = strength_config[user_choice] password = ''.join(random.choice(config["chars"]) for _ in range(config["length"])) print(f"生成的密码:{password}") password_generator()
代码说明:
strength_config字典把每个强度等级和规则绑定,后续修改规则或新增等级,直接改字典即可,不用动核心逻辑- 用
random.choice()替代chr(random.randint()),更直观灵活,能直接从自定义字符集选字符 - 用
''.join()直接生成字符串,比先存数组再处理更高效
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

