鱼C论坛

 找回密码
 立即注册
查看: 1724|回复: 11

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

[复制链接]
发表于 2023-8-3 15:17:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大佬们,可以帮我改一段代码吗?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[index_username]:
            print('登陆成功')
            break
        else:
            print('账号或密码错误')
            break
else:
    print('账号或密码错误')
user_data.txt
d13423523---123456
fly---111
li---666
jay---333fly---66
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i]:            print('登录成功')            break        else:            print('账号或密码错误')            breakelse:    print('账号或密码错误')
对于账号是否存在非法字符的判断,我修改了变量名,使用了更加直观的char表示每个字符,并对username中的每个字符进行检查。如果存在非法字符,会按要求输出提示信息。

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

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

希望这些修改能够帮助你完成注册功能和登录功能的实现。如果有任何问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[index_username]:
        print('登陆成功')
    else:
        print('账号或密码错误')
else:
    print('账号或密码错误')

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

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

这些修改应该能够使你的代码更加稳定地实现注册和登录功能,同时考虑了用户名非法字符和用户名已注册的情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 15:17:37 | 显示全部楼层
首先,根据你提供的代码和要求,我帮你进行了一些修改。请注意以下几点:

- 代码注释和字符串前面的"#"符号之间需要有一个空格。
- 建议将非法字符的列表从全局变量移动到循环内部。这样可以在每次循环时重新初始化,以避免问题。
- 注册功能的用户名是否已被注册的判断部分存在逻辑错误,请参考下方的修改示例。
- 登录功能需要在读取用户数据后关闭文件。
# coding:utf-8# @Author: 星空日记# 注册功能illegal_str = ['[b]', '[/b]', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']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[index_username]:            print('登陆成功')            break        else:            print('账号或密码错误')            breakelse:    print('账号或密码错误')
此外,请确认user_data.txt文件中的内容是否按照以下格式进行存储:

[/code]
d13423523---123456
fly---111
li---666
jay---333
fly---66
[/code]

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

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 15:18:42 | 显示全部楼层
给我最佳答案呗!求你了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 15:19:57 | 显示全部楼层
我也来求求吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 15:20:53 | 显示全部楼层
本帖最后由 Mike_python小 于 2023-8-3 12:22 编辑

啊?(楼上和楼上上)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-3 15:26:48 | 显示全部楼层
Mike_python小 发表于 2023-8-3 15:20
啊?(楼上和楼上上)

我是被ben逼的,只能同流合污了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-3 16:16:52 | 显示全部楼层
有修改后的代码吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i]:
            print('登录成功')
            break
        else:
            print('账号或密码错误')
            break
else:
    print('账号或密码错误')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[index_username]:
        print('登陆成功')
    else:
        print('账号或密码错误')
else:
    print('账号或密码错误')
主要的修改包括:

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

使用道具 举报

发表于 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[index]:
        print('登陆成功')
    else:
        print('账号或密码错误')
else:
    print('账号或密码错误')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 03:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表