一、要求:
- 输入用户名密码
- 认证成功后显示欢迎信息
- 输错三次后锁定
二、程序流程图
三、代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: Jeff Zhu
import getpass
usr_info = [
["Zhang San","asdf123","Logout"], #每个元素是一个列表,有3个子元素,分别是用户名,密码,状态
["Li Si","dsaff1","Logout"], #状态有三种 Login,Logout,Locked
["Wang Wu","123456","Logout"],
["Zhao Er Ma Zi","888888","Logout"],
]
wrong_times = 0
while True:
usr_name_input = input("请输入用户名>>>")
for i in range(len(usr_info)):
if usr_info[i][0] == usr_name_input:
usr_index = i
break
else:
usr_index = -1
if usr_index != -1: #用户存在
if usr_info[usr_index][2] != "Locked": #判断用户是否被锁定
while wrong_times < 3:
#usr_pwd_input = input("请输入密码>>>")
usr_pwd_input = getpass.getpass("请输入密码>>>") #提示用户输入密码
if usr_pwd_input == usr_info[usr_index][1]:#密码正确
print("%s,Wellcome!"%usr_info[usr_index][0])
usr_info[usr_index][2] = "Login"#状态变更为Login
wrong_times = 0
break
else:#密码错误
print("密码错,请重新输入")
wrong_times += 1
else:
print("连续输错3次,账户被锁定")
usr_info[usr_index][2] = "Locked"
wrong_times = 0
if usr_info[usr_index][2] == "Login":
break
else:
print("该账户已被锁定")#提示用户已被锁定
else:
print("用户不存在")#提示用户名不存在
四、小结
1、建立一个list把所有用户的用户名,密码和状态存进去,在流程分支控制时,可以作为标志位来使用。
2、getpass在pycharm中无法使用,需要到命令行中才能起作用,之前还以为是程序问题,总是死在获取密码那里,后来发现是pycharm的问题。
3、用户名查表那里,我使用了一个索引变量来指向查找的字符串,在C语言中经常使用此类技巧,不知Python中还有没有更好的方法。