zoukankan      html  css  js  c++  java
  • 老男孩Day1作业(一):编写登录接口

    要求:编写登录接口

    1. 输入用户名和密码

    2. 认证成功后显示欢迎信息

    3. 输错三次后锁定


     1)编写思路

    编写思路参考下面GitHub链接中的流程图

    https://github.com/ChuixinZeng/PythonStudyCode/blob/master/PythonCode-OldBoy/Day1/作业/Day1_作业_登录接口流程图.png


     2)具体实现

     1 # -*- coding:utf-8 -*-
     2 
     3 # Author:Chuixin Zeng
     4 
     5 # 字典和列表的区别:列表是有顺序的,使用索引访问;而字典中的条目是用键来访问的
     6 
     7 # 初始化空字典
     8 _user_dict = {}
     9 # 初始化空列表list,有了空的列表之后,程序就可以向这个列表中增加元素
    10 _user_list = []
    11 # 初始化登录不存在用户名的初始值为0
    12 _login_error_count = 0
    13 
    14 # 使用while开始无限制的循环
    15 while True:
    16     # 交互式输入登录用户名和密码
    17     _user_naming = input("Pls input your username:")
    18     _user_password = input("Pls input your password:")
    19     # 读取用户登录数据文件UserPassword.txt
    20     _users_data = open('UserPassword.txt')
    21     # 循环遍历打开的数据,对打开的数据进行格式化操作,然后把格式化以后的数据保存到创建好的_user_dict字典当中
    22     for user_data in _users_data:
    23         # 使用strip去除user_data数据行中的前后空格
    24         _user_list = user_data.strip()
    25         # 将去除前后空格之后的数据行_user_list使用逗号进行分割,并重新保存到_user_datas中
    26         _user_datas = _user_list.split(',')
    27         # 将_user_datas数据行中的第0个位置的数据(即用户名),去除前后空格后,赋给新的变量_user_name
    28         _user_name = _user_datas[0].strip()
    29         # 将_user_datas数据行中的第1个位置的数据(即密码),去除前后空格后,赋给新的变量_user_pass
    30         _user_pass = _user_datas[1].strip()
    31         # 将_user_datas数据行中的第2个位置的数据(即锁定状态,0代表未锁定,1代表锁定),去除前后空格后,赋给新的变量_user_locked
    32         _user_locked = _user_datas[2].strip()
    33         # 将_user_datas数据行中的第3个位置的数据(即密码输入错误次数),去除前后空格后,赋给新的变量_user_error_count
    34         # 将_user_datas[3]的数据类型强制转换为int
    35         _user_error_count = int(_user_datas[3].strip())
    36         # 将前面定义好的变量信息,保存到字典中,为前面的值指定键名,即键:值对应的关系,键名可以随便起,建议考虑易读性
    37         # 如果下面的键名出线下划波浪线,并不代表有语法错误,而是编辑器认为拼写的英文不是正确的英文单词,不影响脚本执行
    38         # 按照Python的编程规范,在逗号和冒号后面需要加一个空格
    39         _user_dict[_user_name] = {'name': _user_name, 'password': _user_pass,
    40                                   'locked': _user_locked, 'errorcount': _user_error_count}
    41 
    42     # 关闭打开的UserPassword.txt文件
    43     _users_data.close()
    44 
    45     # 判断用户账户是否已经被锁定,将前面交互界面输入的用户名和字典里保存的用户名列进行匹配
    46     # 将前面交互式输入的用户名和字典中的userlocked键进行匹配,如果用户名对应的键为1,就是被锁定了,退出登录
    47     if _user_naming in _user_dict.keys():
    48         if _user_dict[_user_naming]['locked'] == '1':
    49             print("The account was locked,pls contact administrator!")
    50             break
    51         # 将前面输入的用户名、密码和字典中的用户名、密码进行匹配,如果成功,则输出登录系统,然后退出
    52         if _user_naming == _user_dict[_user_naming]['name'] and _user_password == _user_dict[_user_naming]['password']:
    53             print("Welcome to System!")
    54             break
    55         else:
    56             # 如果用户名在字典里,但是密码不对,将前面输入的用户名所对应字典中的错误次数进行自增
    57             _user_dict[_user_naming]['errorcount'] += 1
    58             # 如果用户名输入正确的情况下,密码输入错误的次数小于3次,给用户重新尝试的机会
    59             if _user_dict[_user_naming]['errorcount'] < 3:
    60                 print("The password was wrong,pls try again,your have three chance!")
    61                 # 追加写入新的数据到UserPassword.txt,其中的errorcount会随着失败尝试次数的增加而增加,三次就是2,即0,1,2
    62                 _write_data = open('UserPassword.txt', 'w+')
    63                 # 将字典里面的值取到_user_value中,进行循环遍历
    64                 for _user_value in _user_dict.values():
    65                     # 往脚本开头定义好的空列表里面逐行写入数据
    66                     _user_list = [_user_value['name'], _user_value['password'], str(_user_value['locked']),
    67                                   str(_user_value['errorcount'])]
    68                     # 将写入到_user_list的数据再次进行格式化后赋给_users_list
    69                     _users_list = ','.join(_user_list)
    70                     # 将_users_list中的数据写入到UserPassword.txt中,并在每一行数据的结尾进行换行
    71                     _write_data.write(_users_list + '
    ')
    72                 # 关闭UserPassword.txt文档
    73                 _write_data.close()
    74 
    75             else:
    76                 # 如果密码不正确的次数已经超过3次,就输出账户被锁定
    77                 print("You try three times,Account locked")
    78                 # 输出账户锁定的同时,将字典中locked键的值设置为1,这个地方改成1,前面判断Locked状态的IF才生效
    79                 _user_dict[_user_naming]['locked'] = 1
    80                 # 账户设置为锁定之后,将用户对应的错误密码次数清零,我理解的是锁定属性为1了,错误次数可以清零
    81                 _user_dict[_user_naming]['errorcount'] = 0
    82                 _write_data = open('UserPassword.txt', 'w+')
    83                 for _user_value in _user_dict.values():
    84                     _user_list = [_user_value['name'], _user_value['password'], str(_user_value['locked']),
    85                                   str(_user_value['errorcount'])]
    86                     _users_list = ','.join(_user_list)
    87                     _write_data.write(_users_list + '
    ')
    88                 _write_data.close()
    89                 break
    90 
    91 
    92     else:
    93         # 如果用户名不存在,则输出信息
    94         print("Pls ensure input currect account or password,you can try three times!")
    95         # 程序开头设置了初始化不存在用户名的值为0,这里进行自增
    96         _login_error_count += 1
    97         # 如果不存在的用户尝试次数超过3次,则中断程序
    98         if _login_error_count > 2:
    99             break

     3)Github笔记

    第一天的笔记的地址是:

    https://github.com/ChuixinZeng/PythonStudyCode/tree/master/PythonCode-OldBoy/Day1/随堂练习

    第一天作业的地址是:

    https://github.com/ChuixinZeng/PythonStudyCode/tree/master/PythonCode-OldBoy/Day1/作业


     4)Readme.md文档

    https://github.com/ChuixinZeng/PythonStudyCode/blob/master/PythonCode-OldBoy/Day1/作业/Readme_登陆接口.md

  • 相关阅读:
    第002篇 深入体验C#项目开发(一)
    C#编程打字指法练习
    第001篇——C#学习计划开启
    2020杭电多校第一场(待更新)
    LeetCode双周赛11
    LeetCode双周赛10
    LeetCode Weekly 156
    NOIP模板复习(4)区间操作之莫队算法,树状数组,线段树
    NOIP模板复习(3) 最短路三巨头Floyd,Dijkstra与SPFA
    NOIP模板复习(2) LCA的三种解法
  • 原文地址:https://www.cnblogs.com/ChuixinZeng/p/JamieZeng_Day1.html
Copyright © 2011-2022 走看看