谢谢你的点击,接下来你将看到一个Python的初学者掉头发的过程。
题目来自于B站:Python资源库 视频BV号:BV1Vf4y1v78U
我们观察题目,发现注册的账号要能在下一次程序运行的时候使用(废话),所以账号的数据不能放在内存里,我们需要一个存放账号数据的文件。其次账号输错三次会被锁定,所以我们需要一个被锁定账号的文件(也可以放在账号文件里面,但是我代码都写完了,我是真的不想改了)。
🆗,题目看完了就要开始掉头发了,首先我们先浏览一下我的头发
import sys users_count: int = -1 #记录锁定账号
add_or_login = input("注册(0)或者登录(1)") #选择功能
f = open('D:/Pyhthon test/Project/admin.txt', 'a+') #以修改的方式打开账号文件
f2 = open('D:/Pyhthon test/Project/admin.txt', 'r') #以只读的方式打开账号文件
loc=open('D:/Pyhthon test/Project/locken.txt', 'a+') #以修改的方式打开锁定文件
loc2 =open('D:/Pyhthon test/Project/locken.txt', 'r') #以只读的方式打开锁定文件
users = ['' for x in range(0, 1000)] #用于记录密码错误的账号
words = [0 for x in range(0, 1000)] #用于记录密码错误账号的次数
if add_or_login == str(0):
username = input("请输入你的用户名")
Password = input("请输入你的密码")
f.write(username + ',' + Password + '\n')
else:
for i in range(3):
loc2.seek(0)
f2.seek(0)
dec = 0
username = input("请输入你的用户名")
Password = input("请输入你的密码")
for line in loc2:
str=line.strip()
if username == str[:str.index('.')]:
print('你号没了心里没点数?')
sys.exit()
for line2 in f2:
str = line2.strip()
str2 = ','
user_name = str[:str.index(str2)]
pass_word = str[str.index(str2)+1:]
if user_name == username and Password == pass_word:
dec = 1
break
if dec == 1:
print('登录成功')
break
else:
print("蠢货,连自己的密码都能忘")
for j in range(len(users)):
if users[j] != username:
users_count += 1
users[users_count] = username
words[users_count] += 1
else:
words[j] += 1
if words[j] == 3:
loc.write(username + '.'+'\n')
print('你号没了')
break
首先我们的程序有注册和登录两块,所以应该先让用户选择
add_or_login = input("注册(0)或者登录(1)")
用户选择注册,那就太好了,太轻松了!
f = open('D:/Pyhthon test/Project/admin.txt', 'a+') #以修改的方式打开账号文件
…… #中间代码省略
if add_or_login == str(0):
username = input("请输入你的用户名")
Password = input("请输入你的密码")
f.write(username + ',' + Password + '\n')
…… #这也是
这里用到了一个 open() 函数。他的作用就是打开一个文件(只读/只写/读写/…)
当用户选择登录时,就要让用户输入账号密码了
else:
for i in range(3):
……
username = input("请输入你的用户名")
Password = input("请输入你的密码")
这里为什么要循环三次?因为当他们账号密码输入错误的时候让他们重新输入
输入完之后别忘了,账号有可能被锁定的哦所以我们要判断账号是否被锁定
import sys
……
for line in loc2:
str=line.strip()
if username == str[:str.index('.')]:
print('你号没了心里没点数?')
sys.exit()
如果账号被锁定了,程序就会发出温馨的提醒,然后结束程序。
这里循环的格式为 for line in loc2:
那么 loc2 是什么呢?
根据前面的定义我们知道 loc2 是打开文件所使用的变量
这句话的意思便是将 loc2 打开的文件里面的内容赋给 line
这样我们便可以对文件的数据进行操作,注意这里文件打开的方式需要是 ‘w’ ,这也是我为什么一个文件打开了两次的原因,如果按照我所给的链接里面的内容解释,按道理来讲 ‘a+’ 也应该是可以的,但是我在测试的过程中发现并不可以,Pycharm和运行结果皆未报错,但是循环一次也没进行。在没办法的情况下我选择了这种办法(鬼知道我测出这个问题掉了多少头发,循环体不运行的时候我人都是懵的)。如果有大佬看这篇博文麻烦帮我解答一下啦,小弟先谢过了。
这里面还有一个函数 strip() ,他的具体作用是去掉字符串两边的空格,这个空格也包含一些特殊符号,如:\n (其他的没记住😥😥😥)
提一嘴,如果要在txt里面修改信息,按我的代码需要保持这样的格式
还有for循环读取数据是以一行的方式读取的,所以两个账号就用两行来存放
如果没有被锁定,那我们就要开始账号密码的匹配了
for line2 in f2:
str = line2.strip()
str2 = ','
user_name = str[:str.index(str2)]
pass_word = str[str.index(str2)+1:]
if user_name == username and Password == pass_word:
dec = 1
break
if dec == 1:
print('登录成功')
break
else:
print("蠢货,连自己的密码都能忘")
匹配成功就提示登录成功,匹配失败也会提醒
但这时候我们发现了一个问题,存储的账号密码都是在一个变量里,怎么分来来各自匹配呢? 这时候就要用到 [:] 了,这个符号就是用来切片的
什么是切片?
Look me
好,我们数据也匹配好了,接下来就是做锁定账号的部分了
话不多说,看代码
users_count: int = -1 #记录错误账号个数
……
loc =open('D:/Pyhthon test/Project/locken.txt', 'a+')
loc2 =open('D:/Pyhthon test/Project/locken.txt', 'r')
users = ['' for x in range(0, 1000)] #定义数组,并赋予初值''
words = [0 for x in range(0, 1000)] #定义数组,并赋予初值0
……
else:
for i in range(3):
loc2.seek(0)
f2.seek(0)
…………………………………………
for j in range(len(users)):
if users[j] != username:
users_count += 1
users[users_count] = username
words[users_count] += 1
else:
words[j] += 1
if words[j] == 3:
loc.write(username + '.'+'\n')
break
用数组记录每个账号的错误次数,错误三次我们便把它写到我们的小本本上,放进小黑屋。
seek() 必须要写哦 不然你密码第一次输错后面就都对不了啦
大功告成,任务完成。。。应该每一条代码都讲了吧。。代码还有很多不完善的地方,我也想到了但是我是真的不想改了
最后感谢以上提及的链接以及许多没放出来的博主分享的知识,有你们的帮助我才能完成这一个题目,谢谢。
接下来就是我诉苦的环节啦,没事的可以走了。
开始写串代码的时候,我Python什么都不会。我是在自学。B站视频我也只看到 for 语句 if 语句,这段代码中所有的函数都是我百度一点点学来的,什么 open() 静态数组赋初值 seek() for循环读文件 strip() [m:n] 甚至刚开始连 for if 语句体怎么结束都不知道(上课开小差🙃🙃) 这也是为什么我写了一天的原因
我说这个是因为这个题目真的让我成长了很多。我的心里话很想说出来,也别笑话我,我也知道自己菜。写完这个程序我才发现我是真的喜欢编程,哪怕挠破头。我喜欢编程和思考的过程,喜欢写完程序后的成就感。这种真的是游戏那些没法比的。这些话就当是讲给我自己听的吧。
愿自己不在颓废,奋斗!