这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战
注册、登陆、退出综合篇
要求:
# 2.2:编写程序实现用户注册后(注册到文件中),可以登录(登录信息来自于文件)
提示:
while True:
msg = """
0 退出
1 登录
2 注册
"""
print(msg)
cmd = input('请输入命令编号>>: ').strip()
if not cmd.isdigit():
print('必须输入命令编号的数字,傻叉')
continue
if cmd == '0':
break
elif cmd == '1':
# 登录功能代码(附加:可以把之前的循环嵌套,三次输错退出引入过来)
pass
elif cmd == '2':
# 注册功能代码
pass
else:
print('输入的命令不存在')
# 思考:上述这个if分支的功能否使用其他更为优美地方式实现
在综合之前,我们先对注册优化一下
优化前:
# 获取用户输入的用户名和密码
in_user = input('请输入用户名:').strip()
in_pwd = input('请输入密码:').strip()
# 将输入的用户名和密码用“:”分割成字符串
line = in_user + ':' + in_pwd + '\n'
with open('./db_user.txt',mode='at+',encoding='utf-8') as f:
f.write(line)
print('恭喜您{},注册成功'.format(in_user))
优化后:
# 获取用户输入的用户名和密码
in_user = input('请输入用户名:').strip()
in_pwd = input('请输入密码:').strip()
# 将输入的用户名和密码用“:”分割成字符串
user_line = in_user + ':' + in_pwd + '\n'
with open('./users.txt',mode='rt+',encoding='utf-8') as f1,\
open('./users.txt',mode='at+',encoding='utf-8') as f2:
for line in f1:
username,password = line.strip().split(':')
if username == in_user:
print('抱歉,您的用户名已重复,请换一个')
break
else:
f2.write(user_line)
print('恭喜您{},注册成功'.format(in_user))
优化思路:
一般如果我们注册一个用户名之后是不允许再有相同的用户名出现的,所以我们在注册时要先判断用户名是否已经注册过了,如果已经注册过了则提示重复,若没有则正常注册
1.由于不同模式的光标会出现冲突,所以我们用两种方式打开users.txt
with open('./users.txt',mode='rt+',encoding='utf-8') as f1,\
open('./users.txt',mode='at+',encoding='utf-8') as f2:
2.我们先用读的方式将已注册的用户名和密码读出来,然后把用户名提取出来
for line in f1:
username,password = line.strip().split(':')
3.然后判断读出来的已注册的用户名与用户输入的是否相同,如果相同,则提示已重复,然后退出循环
if username == in_user:
print('抱歉,您的用户名已重复,请换一个')
break
4.如果循环结束没有被break打断则说明没有冲突的用户名,则可以加用户输入的账号密码写入
else:
f2.write(user_line)
print('恭喜您{},注册成功'.format(in_user))
5.最终,完整的注册代码就完成了
# 获取用户输入的用户名和密码
in_user = input('请输入用户名:').strip()
in_pwd = input('请输入密码:').strip()
# 将输入的用户名和密码用“:”分割成字符串
user_line = in_user + ':' + in_pwd + '\n'
with open('./users.txt',mode='rt+',encoding='utf-8') as f1,\
open('./users.txt',mode='at+',encoding='utf-8') as f2:
for line in f1:
username,password = line.strip().split(':')
if username == in_user:
print('抱歉,您的用户名已重复,请换一个')
break
else:
f2.write(user_line)
print('恭喜您{},注册成功'.format(in_user))
综合篇
最后把具体代码粘进来即可
while True:
msg = """
0 退出
1 登录
2 注册
"""
print(msg)
cmd = input('请输入命令编号>>: ').strip()
if not cmd.isdigit():
print('必须输入命令编号的数字,傻叉')
continue
if cmd == '0':
exit()
elif cmd == '1':
# 获取用户输入的用户名和密码
flag = True
black_list = []
while flag:
in_user = input('请输入用户名:').strip()
in_pwd = input('请输入密码:').strip()
# 打开两个文件,可读写模式
with open('./black_users.txt', mode='rt+', encoding='utf-8') as f1, \
open('./users.txt', mode='rt', encoding='utf-8') as f2:
# 先判断是否在黑名单内,如果在,直接锁定,退出循环
for line in f1:
username = line.strip()
if username == in_user:
print('抱歉您的账号被锁定')
flag = False
break
# 如果不在,则判断用户名、密码是否与已知的一致,一致则登陆成功
for line in f2:
username, password = line.strip().split(':')
if username == in_user and password == in_pwd:
print('登陆成功')
flag = False
break
# 如果符合锁定条件,则开始计数,准备锁定账号
elif username == in_user and password != in_pwd:
print('账号密码错误')
black_list.append(in_user)
# 同一个账号,密码输错三次则锁定
if black_list.count(in_user) >= 3:
flag = False
print('抱歉,您的密码输错三次,账号已被锁定')
username = in_user + '\n'
f1.write(username)
break
elif cmd == '2':
# 获取用户输入的用户名和密码
in_user = input('请输入用户名:').strip()
in_pwd = input('请输入密码:').strip()
# 将输入的用户名和密码用“:”分割成字符串
user_line = in_user + ':' + in_pwd + '\n'
with open('./users.txt', mode='rt+', encoding='utf-8') as f1, \
open('./users.txt', mode='at+', encoding='utf-8') as f2:
for line in f1:
username, password = line.strip().split(':')
if username == in_user:
print('抱歉,您的用户名已重复,请换一个')
break
else:
f2.write(user_line)
print('恭喜您{},注册成功'.format(in_user))
\