追光THO 发表于 2023-8-3 15:17:13

注册功能和登录功能实现有问题

大佬们,可以帮我改一段代码吗?python课后作业是实现一个注册功能和登录功能。还有两点要求
1.账号里面是否存在非法字符
2.有没有存在的用户名
具体问题我在代码注释中写了# coding:utf-8
# @Author:星空日记

# #注册功能
illegal_str=['`','`','!','@','#','$','%','^','&','*','(',')']
list_username = []
list_password = []
index_username = 0

print('开始注册账号'.center(20,'-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()


#用户名是否已被注册
with open('data/user_data.txt',mode='rt',encoding='utf-8') as f :
    #想在这里做两个账号和密码分开的列表,但是报错了,不知道怎么修改
    for line in f:
      data_username,data_password = line.strip().split('---')
      list_username.append(data_username)
      list_password.append(data_password)
    for line in f:
      if username in list_username:
            pass
      else:
            print('用户名已被注册')
            break

    # #判断账号是否有非法字符
    else:
      for line1 in username:
            if line1 not in illegal_str:
                pass
            else:
                print('用户名存在非法字符')
                break
      else:
            with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
                res1 = f1.write(f'{username}---{password}')

print(list_password)
print(list_username)
#登录功能
print('开始登录账号'.center(20,'-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()

for line2 in list_username:
    if line2 == input_username:
      index_username = list_username.index(line2)
      if input_password == list_password:
            print('登陆成功')
            break
      else:
            print('账号或密码错误')
            break
else:
    print('账号或密码错误')
user_data.txt
d13423523---123456
fly---111
li---666
jay---333fly---66

Mike_python小 发表于 2023-8-3 15:17:32

根据你提供的代码,我注意到其中存在一些问题。以下是对你的代码进行修改和优化的建议:


# coding:utf-8
# @Author:星空日记

illegal_str = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []

print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()

# 判断用户名是否已被注册
with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
    for line in f:
      data_username, data_password = line.strip().split('---')
      list_username.append(data_username)
      list_password.append(data_password)

if username in list_username:
    print('用户名已被注册')
else:
    # 判断账号是否有非法字符
    for char in username:
      if char in illegal_str:
            print('用户名存在非法字符')
            break
    else:
      with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
            res1 = f1.write(f'{username}---{password}')

print(list_password)
print(list_username)

# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()

for i, name in enumerate(list_username):
    if name == input_username:
      if input_password == list_password:
            print('登录成功')
            break
      else:
            print('账号或密码错误')
            break
else:
    print('账号或密码错误')


对于账号是否存在非法字符的判断,我修改了变量名,使用了更加直观的char表示每个字符,并对username中的每个字符进行检查。如果存在非法字符,会按要求输出提示信息。

在用户名是否已被注册的判断中,我修改了for循环的逻辑。首先遍历文件中的用户名和密码,将它们分别存储在list_username和list_password列表中。然后,如果输入的用户名存在于list_username中,即表示用户名已被注册。

在登录功能中,我使用enumerate()函数获取到索引i和对应的用户名name,然后逐一比较输入的用户名和密码与列表中的对应项。如果找到匹配的用户名和密码,即表示登录成功。

希望这些修改能够帮助你完成注册功能和登录功能的实现。如果有任何问题,请随时提问。

isdkz 发表于 2023-8-3 15:17:35

当涉及到问题解决时,这段代码有几个地方需要进行改进。以下是针对你提供的代码的修改建议:

# coding:utf-8
# @Author:星空日记

# 注册功能
illegal_str = [' ', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []

print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()

# 用户名是否已被注册
with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
    for line in f:
      data_username, data_password = line.strip().split('---')
      list_username.append(data_username)
      list_password.append(data_password)

if username in list_username:
    print('用户名已被注册')
elif any(char in illegal_str for char in username):
    print('用户名存在非法字符')
else:
    with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
      f1.write(f'{username}---{password}\n')

# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()

if input_username in list_username:
    index_username = list_username.index(input_username)
    if input_password == list_password:
      print('登陆成功')
    else:
      print('账号或密码错误')
else:
    print('账号或密码错误')


上述修改主要包括以下几个方面:

1. 注册功能中,对非法字符的判断使用了any()函数来检查用户名是否包含非法字符。
2. 在读取文件时,将用户名和密码分别存储到list_username和list_password列表中,以便后续比较。
3. 登录功能中,直接使用input_username在list_username` 中查找,无需遍历整个列表。
4. 确保注册信息和登录信息在文件中都以换行符结尾,以便每个记录单独占据一行。

这些修改应该能够使你的代码更加稳定地实现注册和登录功能,同时考虑了用户名非法字符和用户名已注册的情况。

学习编程中的Ben 发表于 2023-8-3 15:17:37

首先,根据你提供的代码和要求,我帮你进行了一些修改。请注意以下几点:

- 代码注释和字符串前面的"#"符号之间需要有一个空格。
- 建议将非法字符的列表从全局变量移动到循环内部。这样可以在每次循环时重新初始化,以避免问题。
- 注册功能的用户名是否已被注册的判断部分存在逻辑错误,请参考下方的修改示例。
- 登录功能需要在读取用户数据后关闭文件。

# coding:utf-8
# @Author: 星空日记

# 注册功能
illegal_str = ['', '', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []

print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()

with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
    for line in f:
      data_username, data_password = line.strip().split('---')
      list_username.append(data_username)
      list_password.append(data_password)

# 判断账号是否已被注册
if username in list_username:
    print('用户名已被注册')
else:
    # 判断账号是否有非法字符
    for char in username:
      if char in illegal_str:
            print('用户名存在非法字符')
            break
    else:
      with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
            res1 = f1.write(f'{username}---{password}')

print(list_password)
print(list_username)

# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()

for line2 in list_username:
    if line2 == input_username:
      index_username = list_username.index(line2)
      if input_password == list_password:
            print('登陆成功')
            break
      else:
            print('账号或密码错误')
            break
else:
    print('账号或密码错误')


此外,请确认user_data.txt文件中的内容是否按照以下格式进行存储:


d13423523---123456
fly---111
li---666
jay---333
fly---66


如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

学习编程中的Ben 发表于 2023-8-3 15:18:42

给我最佳答案呗!求你了!!!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-8-3 15:19:57

我也来求求吧{:10_254:}{:10_254:}{:10_254:}{:10_254:}

Mike_python小 发表于 2023-8-3 15:20:53

本帖最后由 Mike_python小 于 2023-8-3 12:22 编辑

啊?(楼上和楼上上)

isdkz 发表于 2023-8-3 15:26:48

Mike_python小 发表于 2023-8-3 15:20
啊?(楼上和楼上上)

我是被ben逼的,只能同流合污了{:5_97:}

追光THO 发表于 2023-8-3 16:16:52

有修改后的代码吗

Mike_python小 发表于 2023-8-3 16:27:15

追光THO 发表于 2023-8-3 13:16
有修改后的代码吗



# coding:utf-8
# @Author:星空日记

illegal_str = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []

print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()

# 判断用户名是否已被注册
with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
    for line in f:
      data_username, data_password = line.strip().split('---')
      list_username.append(data_username)
      list_password.append(data_password)

if username in list_username:
    print('用户名已被注册')
else:
    # 判断账号是否有非法字符
    for char in username:
      if char in illegal_str:
            print('用户名存在非法字符')
            break
    else:
      with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
            res1 = f1.write(f'{username}---{password}')

print(list_password)
print(list_username)

# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()

for i, name in enumerate(list_username):
    if name == input_username:
      if input_password == list_password:
            print('登录成功')
            break
      else:
            print('账号或密码错误')
            break
else:
    print('账号或密码错误')

琅琊王朝 发表于 2023-8-3 21:25:31

下面是修改后的代码,解决了你提出的问题:
illegal_str = ['`', '`', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []

print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()

# 判断账号是否有非法字符
for char in username:
    if char in illegal_str:
      print('用户名存在非法字符')
      break
else:
    with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
      for line in f:
            data_username, data_password = line.strip().split('---')
            list_username.append(data_username)
            list_password.append(data_password)
      if username in list_username:
            print('用户名已被注册')
      else:
            with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
                res1 = f1.write(f'{username}---{password}\n')

# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()

if input_username in list_username:
    index_username = list_username.index(input_username)
    if input_password == list_password:
      print('登陆成功')
    else:
      print('账号或密码错误')
else:
    print('账号或密码错误')

主要的修改包括:

判断账号是否有非法字符时,使用新的循环变量 char,避免与之前的变量 line1 混淆。
在注册账号时,将新注册的用户名和密码写入文件时,添加换行符 \n。
在登录功能中,直接通过条件语句判断用户名和密码是否正确,避免使用循环和索引。
请注意将合适的路径替换 open() 函数中的 'data/user_data.txt'。另外,建议在注册成功后,更新 list_username 和 list_password 列表,以避免重新打开文件读取数据。

tyh小号 发表于 2023-8-4 07:45:45

你好,我发现你的代码有几个问题:

- 你的非法字符列表中有重复的符号,比如两个反引号。
- 你的第一个for循环中,如果用户名在列表中,应该打印“用户名已被注册”,而不是反过来。
- 你的第二个for循环中,如果用户名不在列表中,应该打印“账号或密码错误”,而不是反过来。
- 你的user_data.txt文件中有一个重复的用户名fly,这可能会导致错误。

我尝试修改了一下你的代码,你可以参考一下:

# coding:utf-8
# @Author:星空日记

# #注册功能
illegal_str=['`','!','@','#','$','%','^','&','*','(',')']
list_username = []
list_password = []

print('开始注册账号'.center(20,'-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()


#用户名是否已被注册
with open('data/user_data.txt',mode='rt',encoding='utf-8') as f :
    #用splitlines方法可以直接得到每一行的内容,不需要再用strip和split
    for line in f.splitlines():
      data_username,data_password = line.split('---')
      list_username.append(data_username)
      list_password.append(data_password)
    #用in操作符可以直接判断一个元素是否在列表中,不需要再用for循环
    if username in list_username:
      print('用户名已被注册')
    else:
      #判断账号是否有非法字符
      for char in username:
            if char in illegal_str:
                print('用户名存在非法字符')
                break
      else:
            with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
                res1 = f1.write(f'{username}---{password}\n')

print(list_password)
print(list_username)
#登录功能
print('开始登录账号'.center(20,'-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()

#用index方法可以直接得到一个元素在列表中的位置,不需要再用变量记录
if input_username in list_username:
    index = list_username.index(input_username)
    if input_password == list_password:
      print('登陆成功')
    else:
      print('账号或密码错误')
else:
    print('账号或密码错误')
页: [1]
查看完整版本: 注册功能和登录功能实现有问题