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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:35:24