如何在Python中为变量分配多个字符串值及优化登录程序
登录程序多同义用户名匹配问题解决与优化建议
问题描述
我是Python初学者,正在开发带密码验证的登录程序,希望将多个同义字符串(如不同格式的用户名)关联起来方便用户输入,但两种尝试写法均失败:
- Code 1 将多个字符串赋值为元组,用户输入匹配字符串时判断不相等
- Code 2 多次赋值变量,仅最后一个值生效
错误代码与运行结果
Code 1
User_Name = "Allex_Benzz", "allex benzz", "allex_benzz", "Allex Benzz" User_Input = input("Please Input Your User Name...!\n") if User_Input == User_Name: User_Password = "0011" User_Input_Password = input("Please Enter Your Password...!\n") if User_Input_Password == User_Password: print("Welcome Allex Benzz") else: print("Your Password Is Incorrect..!") else: print("No Users Found")
运行结果:
Please Input Your User Name...! allex benzz #(User Input) No Users Found
原因:User_Name是元组类型,User_Input是字符串类型,用==直接比较字符串和元组永远不相等。
Code 2
User_Name = "Allex_Benzz" User_Name = "allex benzz" User_Name = "allex_benzz" User_Name = "Allex Benzz" User_Input = input("Please Input Your User Name...!\n") if User_Input == User_Name: User_Password = "0011" User_Input_Password = input("Please Enter Your Password...!\n") if User_Input_Password == User_Password: print("Welcome Allex Benzz") else: print("Your Password Is Incorrect..!") else: print("No Users Found")
运行结果:
Please Input Your User Name...! allex benzz #User_Input No Users Found
仅最后一个值生效的情况:
Please Input Your User Name...! Allex Benzz #User_Input Please Enter Your Password...! 0011 #User_Password Welcome Allex Benzz
原因:多次赋值会覆盖变量之前的内容,最终User_Name仅保留最后一个字符串。
解决方案
核心是用集合/列表存储所有同义用户名,然后用in关键字判断用户输入是否在其中,而非用==直接比较。
修正后的代码
# 用集合存储所有可接受的用户名(集合查找效率比列表更高) valid_usernames = {"Allex_Benzz", "allex benzz", "allex_benzz", "Allex Benzz"} user_input = input("请输入用户名...!\n") if user_input in valid_usernames: correct_password = "0011" password_input = input("请输入密码...!\n") if password_input == correct_password: print("欢迎你,Allex Benzz!") else: print("密码错误!") else: print("未找到该用户!")
只要用户输入的是集合中的任意一个用户名,就能通过验证。
登录程序优化建议
1. 用户名规范化处理(更简洁的方案)
不需要维护所有格式的用户名,而是将用户输入和标准用户名统一规范化(比如转小写、统一分隔符):
def normalize_username(username): # 转小写,同时去除空格和下划线,统一格式 return username.lower().replace(" ", "").replace("_", "") # 只需要存储一个规范化后的标准用户名 standard_username = "allexbenzz" user_input = input("请输入用户名...!\n") if normalize_username(user_input) == standard_username: correct_password = "0011" password_input = input("请输入密码...!\n") if password_input == correct_password: print("欢迎你,Allex Benzz!") else: print("密码错误!") else: print("未找到该用户!")
这种方式不管用户输入Allex Benzz、allex_benzz还是ALLEXBENZZ,都会被转换成统一的allexbenzz进行验证,更易维护。
2. 密码安全优化
不要明文存储密码,实际开发中使用哈希算法存储密码哈希值,比如用bcrypt库,同时用getpass模块隐藏密码输入:
import bcrypt import getpass # 预先生成密码哈希(仅需执行一次) password = "0011".encode('utf-8') hashed_password = bcrypt.hashpw(password, bcrypt.gensalt()) # 验证逻辑 user_input = input("请输入用户名...!\n") if normalize_username(user_input) == "allexbenzz": password_input = getpass.getpass("请输入密码...!\n").encode('utf-8') if bcrypt.checkpw(password_input, hashed_password): print("欢迎你,Allex Benzz!") else: print("密码错误!") else: print("未找到该用户!")
3. 多用户支持
如果需要支持多个用户,用字典存储规范化用户名和对应的哈希密码:
users = { "allexbenzz": b'$2b$12$...', # 替换为实际生成的哈希值 "johnsmith": b'$2b$12$...' } user_input = input("请输入用户名...!\n") normalized_input = normalize_username(user_input) if normalized_input in users: password_input = getpass.getpass("请输入密码...!\n").encode('utf-8') if bcrypt.checkpw(password_input, users[normalized_input]): print(f"欢迎你,{normalized_input.replace('benzz', ' Benzz')}!") else: print("密码错误!") else: print("未找到该用户!")
4. 错误处理
增加异常捕获,处理用户中断输入等情况:
try: user_input = input("请输入用户名...!\n") # 后续验证逻辑 except KeyboardInterrupt: print("\n输入已取消")
内容的提问来源于stack exchange,提问作者Taha Koiliwala
相关产品推荐
相关产品推荐

