老男孩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 + '\n')
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 + '\n')
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

转载于:https://www.cnblogs.com/ChuixinZeng/p/JamieZeng_Day1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hashcat源码分析1

typedef struct hash{void *digest;salt_t *salt;void *esalt;void *hook_salt; // additional salt info only used by the hook (host)int cracked;hashinfo_t *hash_info;char *pw_buf;int pw_len;} hash_t;一.1. 信号 函数&a…

Davinci及U-boot的一些介绍

TI推出的数字多媒体平台DM系列&#xff0c;集成了ARM与DSP双核处理器&#xff1a;DSP处理器运行DSP/BIOS操作系统&#xff0c;负责音视频编解码算法以及其他图形处理算法&#xff1b;ARM处理器运行MontaVista Linux操作系统&#xff0c;负责设备初始化、用户图形界面管理。ARM处…

像素越多越好?像元的面积越小越好?为何底大一级压死人?

像素越多越好&#xff1f;像素点的面积越小越好&#xff1f;为何底大一级压死人&#xff1f; 像素是&#xff1a;图像最小单元的数量&#xff0c;例如6000*4000&#xff0c;像素数量就是24*10^6。 像素太少当然图像就看不见了&#xff0c;看不清晰了。 但是现在几乎所有手机和相…

设计模式(5)--工厂模式

//5.工厂模式 //ver1 //回顾简单工厂模式 class OperationFactory { public:static Operation createOperation(char chOper){Operation * op NULL;switch(chOper){case :op new OperationAdd();break;case -:op new OperationSub();break;default:break;}return *op;} };vo…

对于多属性类型系统的数据库设计

主要是以下几类系统: 生活信息系统, 内容:小, 属性:大,电商商品系统, 内容:大, 属性:大,风控征信系统, 内容:小, 属性:大,新闻系统, 内容:大, 属性:小,这些系统共同的特点, 都是在主体内容上会携带多个属性, 并且属性需要随时能调整, 并且要求能兼容旧属性, 还需要频繁的通过属…

linux环境部署常用命令

1.  查看当前所属目录&#xff1a;pwd2.  回到上级目录&#xff1a;cd ../回到上两级目录&#xff1a;cd ../ ../3.  查看当前目录下有哪些文件&#xff1a;ls4.  查看最后100行日志&#xff1a;tail -100 catalina.out动态重看操作日志&#xff1a;tail -f catalina.o…

DM6446开发攻略:V4L2视频驱动和应用分析

针对DAVINCI DM6446平台&#xff0c;网络上也有很多网友写了V4L2的驱动&#xff0c;但只是解析Montavistalinux-2.6.10 V4L2的原理、结构和函数&#xff0c;深度不够。本文决定把Montavista 的Linux-2.6.18 V4L2好好分析一下&#xff0c;顺便讲解在产品中的应用&#xff0c;满足…

相机像素尺寸(像元大小)和成像系统分辨率之间的关系

相机像素尺寸&#xff08;像元大小&#xff09;和成像系统分辨率之间的关系 在显微成像系统中&#xff0c;常常会用分辨率来评价其成像能力的好坏。这里的分辨率通常是指光学系统的极限分辨率以及成像探测器的图像分辨率。最终图像所呈现出的实际分辨率&#xff0c;取决于二者的…

H5网页播放器播不了服务器上的mp4视频文件

打开IIS&#xff0c;在功能视图里找到MIME类型菜单&#xff0c;打开该菜单后鼠标右键添加.mp4扩展名的MIME类型video/mp4 其他视频文件播放不了估计也得在IIS里添加对应的MIME类型&#xff08;从服务器下载文件时也得添加对应的MIME类型&#xff09; 转载于:https://www.cnblog…

不定宽度居中

一、传统方法 <div class"wrap"><div class"inner">html &#xff1a; 让 inner 居中</div> </div> .wrap {float: left; /* 自适应内容宽度 */position: relative;left: 50%; } .inner {position: relative;left: -50%; } 二、…

文章目录自动生成器

提供一个插件&#xff0c;可以实现segmentfault的文章目录效果啦~~ 不止点击跳转还滚动激活当前链接 demo地址 使用很简单 <!-- 文章容器 --> <div id"kCatelog"></div> <!-- 目录容器 --> <div class"k-catelog-list" id"…

基于ARM+DSP进行应用开发-经验共享

针对当前应用的复杂性&#xff0c;SOC芯片更好能能满足应用和媒体的需求&#xff0c;集成众多接口&#xff0c;用ARM做为应用处理器进行多样化的应用开发和用户界面和接口&#xff0c;利用DSP进行算法加速&#xff0c;特别是媒体的编解码算法加速&#xff0c;既能够保持算法的灵…

工业相机之全局曝光与卷帘曝光

曝光方式包括两种&#xff1a; 全局曝光&#xff08;global shutter&#xff09;卷帘曝光&#xff08;rolling shutter&#xff09; CCD相机都是全局曝光&#xff0c;CMOS相机既有全局曝光也有卷帘曝光 全局曝光 全局曝光的方式比较简单。也就是说光圈打开后&#xff0c;整个图…

Hibernate入门注解笔记

Entity 代表实体 映射一张表 Table 定义表的属性 Embeddable 定义类级别可以被嵌入 Id 指定主键 GeneratedValue 指定主键生成策略 Column指定列级别的属性 Embedded 指定属性为被包含类 将被包含类 作为 包含类的 字段属性 写入同一张表 EmbeddedId 指定包含类为特定主键 实…

.NET 环境中使用RabbitMQ

在企业应用系统领域&#xff0c;会面对不同系统之间的通信、集成与整合&#xff0c;尤其当面临异构系统时&#xff0c;这种分布式的调用与通信变得越发重要。其次&#xff0c;系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方&#xff0c;比如发送短信&#…

css3 pointer-events:none 允许点击穿透

开发时加了蒙层&#xff0c;却可以点击到蒙层下边的元素。查了以后才发现是 pointer-events:none属性具有允许点击穿透的功能&#xff0c;将其设为 pointer-events:auto就好使了。事件穿透让我想起了zepto.js中的tap事件同样会引发事件穿透的效果。如果用tap事件是为了提升响应…

成像质量、像素个数、感光元件尺寸的关系

成像质量、像素个数、感光元件尺寸的关系 感光元件 (影像传感器) 就是拍摄的照片最终成像的位置。相当于传统相机里面的胶卷&#xff0c;不同相机的感光元件尺寸是不一样的。 1. 像素的含义 两个 100 平方米的房子 A 和 B&#xff0c;A 房子里面平均分成 10 个房间&#xff…

setjmp与logjmp用法总结

setjmp/logjmp的最大用途是错误恢复&#xff0c;只要还没有从主函数退出&#xff0c;一旦发现一个不可恢复的错误&#xff0c;可以把主控制转移大主函数循环&#xff0c;并从那从新开始。使用时必须包含头文件<setjmp.h> setjmp与longjmp结合使用时&#xff0c;它们必须…

JQ对象到底是什么

jQuery对象是什么&#xff0c;举个例子&#xff0c;$(#id) 返回的就是jQuery对象&#xff0c;这个东西是整个jQuery的核心所在&#xff0c;所以我先来分析它。 var jQuery function( selector, context ) { // The jQuery object is actually just the init constructor enhan…

15、iOS开发之duplicate symbols for architecture x86_64错误

1. 错误提示 2. 分析错误原因 3. 解决问题办法 一、错误提示 在我们写代码过程中可能会经常遇到这样一个错误&#xff1a; [objc] view plaincopy print?<span style"font-size:32px;color:#ff0000;">ld: 4 duplicate symbols for architecture x86_64 clang…