python开发基础作业01:模拟登陆系统
随老男孩学习python mark
作业要求及提示:编写登录接口
'''
练习程序:编写登录接口
1. 输入用户名和密码
2. 认证成功后显示欢迎信息
3. 输错三次后锁定
输入三次后退出,下次同样用户名再登陆就显示用户已经被锁定,用户锁定信息可以保存在硬盘文件里面,跟硬盘文件进行交互
不能用shell命令,只能用Python的自带的文件调用的接口(可以对文件增删改查),先学文件处理怎么弄
4.用户名和密码从文件里面读取,还有一个检查账户锁定的文件
'''
作业知识点:
模拟登陆系统主要练习文件的操作、条件语句、循环等
1.str.strip([chars]):
删除字符串前边和后边的所有空格,chars参数可以定制需要删除的字符,可选。
input().strip()可以去除用户输入时带入的空格,避免产生不必要的错误。
用法:
account = input('请输入账号:').strip()
2.str.upper()
转换字符串中的所有小写字母为大写字母
command = input('请输入指令:').strip()
if command.upper() == 'A':
add_user(database)
不管输入的指令给为A或a都会执行此项。
3.dict.get(key)
获取字典中的key对应的value,若key不存在则返回None,
if database.get(account) == None:
如果key不存在不会报错
流程图

代码示例1
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author : "David J"
##未利用文件,未实现持续锁定
import sys
users_list = {"jdw":"123","smz":"123"}
locked_count = 0
log_error_count = 0
#登录模块
while True:
username = input("please input your username:").strip()
password = input("please input your password:")
#判断用户名和密码是否相同
if username in users_list.keys():
if password == users_list[username]:
print("登录成功")
sys.exit()
else:
log_error_count += 1
if log_error_count < 3:
print("用户名或密码错误,请重试!")
else:
locked_count = 1
print("重试超过三次,已锁定!")
sys.exit()
else:
log_error_count += 1
if log_error_count < 3:
print("用户名错误,请重试!")
else:
locked_count = 1
print("重试超过三次,已锁定!")
sys.exit()
代码示例2
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author : "David J"
#登录数据文件UserPassword.txt,实现用户三次错误后锁定
# 字典和列表的区别:列表是有顺序的,使用索引访问;而字典中的条目是用键keys来访问的
# 初始化空字典
user_dict = {}
# 初始化空列表list,有了空的列表之后,程序就可以向这个列表中增加元素
user_list = []
# 用户密码错误的初始值为0
login_error_count = 0
# 使用while开始无限制的循环
while True:
# 交互式输入登录用户名和密码
logon_name = input("Pls input your username:")
pass_word = input("Pls input your password:")
# 读取用户登录数据文件UserPassword.txt
'''
UserPassword.txt示例
jdw,123456,0,0
smz,123456,0,0
root,123456,0,0
cslc,123456,0,0
'''
users_data = open('UserPassword.txt','r')
# 循环遍历打开的数据,对打开的数据进行格式化操作,然后把格式化以后的数据保存到创建好的user_dict字典当中
for user_data in users_data:
# 使用strip去除user_data数据行中的前后空格
user_list = user_data.strip()
# 将去除前后空格之后的数据行user_list使用逗号进行分割,并重新保存到user_datas中
user_datas = user_list.split(',')
# 将user_datas数据行中的第0个位置的数据(即用户名),去除前后空格后,赋给新的变量user_name
user_name = user_datas[0].strip()
# 将user_datas数据行中的第1个位置的数据(即密码),去除前后空格后,赋给新的变量user_passwd
user_passwd = user_datas[1].strip()
# 将user_datas数据行中的第2个位置的数据(即锁定状态,0代表未锁定,1代表锁定),去除前后空格后,赋给新的变量user_locked
user_locked = user_datas[2].strip()
# 将user_datas数据行中的第3个位置的数据(即密码输入错误次数),去除前后空格后,赋给新的变量user_error_count
# 将user_datas[3]的数据类型强制转换为int
user_error_count = int(user_datas[3].strip())
# 将前面定义好的变量信息,保存到字典中,为前面的值指定键名,即键:值对应的关系,键名可以随便起,建议考虑易读性
# 如果下面的键名出线下划波浪线,并不代表有语法错误,而是编辑器认为拼写的英文不是正确的英文单词,不影响脚本执行
# 按照Python的编程规范,在逗号和冒号后面需要加一个空格
user_dict[user_name] = {'name': user_name, 'password': user_passwd,
'locked': user_locked, 'errorcount': user_error_count}
# 关闭打开的UserPassword.txt文件
users_data.close()
# 判断用户账户是否已经被锁定,将前面交互界面输入的用户名和字典里保存的用户名列进行匹配
# 将前面交互式输入的用户名和字典中的userlocked键进行匹配,如果用户名对应的键为1,就是被锁定了,退出登录
if logon_name in user_dict.keys():
if user_dict[logon_name]['locked'] == '1':
print("This user was locked,pls contact administrator!")
break
# 将前面输入的用户名、密码和字典中的用户名、密码进行匹配,如果成功,则输出登录系统,然后退出
if logon_name == user_dict[logon_name]['name'] and pass_word == user_dict[logon_name]['password']:
print("Welcome to System!")
break
else:
# 如果用户名在字典里,但是密码不对,将前面输入的用户名所对应字典中的错误次数进行自增
user_dict[logon_name]['errorcount'] += 1
# 如果用户名输入正确的情况下,密码输入错误的次数小于3次,给用户重新尝试的机会
if user_dict[logon_name]['errorcount'] < 3:
print("The password was wrong,pls try again,your have three chance!")
# 追加写入新的数据到UserPassword.txt,其中的errorcount会随着失败尝试次数的增加而增加,三次就是2,即0,1,2
write_data = open('UserPassword.txt', 'w+')
# 将字典里面的值取到_user_value中,进行循环遍历
for user_value in user_dict.values():
# 往脚本开头定义好的空列表里面逐行写入数据
user_list = [user_value['name'], user_value['password'], str(user_value['locked']),
str(user_value['errorcount'])]
# 将写入到user_list的数据再次进行格式化后赋给users_list
users_list = ','.join(user_list)
# 将users_list中的数据写入到UserPassword.txt中,并在每一行数据的结尾进行换行
write_data.write(users_list + '\n')
# 关闭UserPassword.txt文档
write_data.close()
else:
# 如果密码不正确的次数已经超过3次,就输出账户被锁定
print("You try three times,Account locked")
# 输出账户锁定的同时,将字典中locked键的值设置为1,这个地方改成1,前面判断Locked状态的IF才生效
user_dict[logon_name]['locked'] = 1
# 账户设置为锁定之后,将用户对应的错误密码次数清零,我理解的是锁定属性为1了,错误次数可以清零
user_dict[logon_name]['errorcount'] = 0
write_data = open('UserPassword.txt', 'w+')
for user_value in user_dict.values():
user_list = [user_value['name'], user_value['password'], str(user_value['locked']),
str(user_value['errorcount'])]
users_list = ','.join(user_list)
write_data.write(users_list + '\n')
write_data.close()
break
else:
# 如果用户名不存在,则输出信息
print("Pls ensure input currect account or password,you can try three times!")
# 程序开头设置了初始化不存在用户名的值为0,这里进行自增
login_error_count += 1
# 如果不存在的用户尝试次数超过3次,则中断程序
if login_error_count > 2:
break
python开发基础作业01:模拟登陆系统的更多相关文章
- python开发基础作业02:三级菜单,使用字典dic及列表
作业要求及提示:三级菜单 ''' 1.三级菜单 2.可依次进入各子菜单 3.菜单能够回到上一级 4.用到知识点:字典.列表.多层循环.函数 条件:基本 if else 嵌套 if...if... ...
- python 操作mysql数据库之模拟购物系统登录及购物
python 操作mysql数据库之模拟购物系统登录及购物,功能包含普通用户.管理员登录,查看商品.购买商品.添加商品,用户充值等. mysql 数据库shop 表结构创建如下: create TAB ...
- python作业:模拟登陆(第一周)
模拟登陆作业需求: 1. 用户输入帐号密码进行登陆 2. 用户信息保存在文件内 3. 用户密码输入错误三次后锁定用户 额外实现功能: 1.提示输入错误次数 2.输入已锁定用户会提示 3.用户不存在会提 ...
- 还在用Alpine作为你Docker的Python开发基础镜像?其实Ubuntu更好一点
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_173 一般情况下,当你想为你的Python开发环境选择一个基础镜像时,大多数人都会选择Alpine,为什么?因为它太小了,仅仅只有 ...
- Python 开发轻量级爬虫01
Python 开发轻量级爬虫 (imooc总结01--课程目标) 课程目标:掌握开发轻量级爬虫 为什么说是轻量级的呢?因为一个复杂的爬虫需要考虑的问题场景非常多,比如有些网页需要用户登录了以后才能够访 ...
- Python爬虫学习笔记之模拟登陆并爬去GitHub
(1)环境准备: 请确保已经安装了requests和lxml库 (2)分析登陆过程: 首先要分析登陆的过程,需要探究后台的登陆请求是怎样发送的,登陆之后又有怎样的处理过程. 如果已经 ...
- python之scrapy携带Cookies模拟登陆
知识点 """ scrapy两种模拟登陆: 1.直接携带cookie 2.找到发送post请求的url地址,带上信息,发送请求 应用场景: 1.cookie过期时间很长, ...
- Python实战之实现简单的登陆系统-作业
#!usr/bin/env Python3 # -*-coding:utf-8-*- #编写登陆接口 #输入用户名密码 #认证成功后显示欢迎信息 #输错三次后锁定 __author__="W ...
- Python开发基础-Day32 进程间通信、进程池、协程
进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程 ...
随机推荐
- go 语言实现栈原理
package main import "fmt" type StackNode struct { Data interface{} //数据 Next *StackNode // ...
- 2019-08-04 纪中NOIP模拟B组
T1 [JZOJ3403] 数列变换 题目描述 小X看到堆成山的数列作业十分头疼,希望聪明的你来帮帮他.考虑数列A=[A1,A2,...,An],定义变换f(A,k)=[A2,A3,...,Ak,A1 ...
- Flink流处理(一)- 状态流处理简介
1. Flink 简介 Flink 是一个分布式流处理器,提供直观且易于使用的API,以供实现有状态的流处理应用.它能够以fault-tolerant的方式高效地运行在大规模系统中. 流处理技术在当今 ...
- HDU多校第三场 Hdu6606 Distribution of books 线段树优化DP
Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\ ...
- VS调试工具
F5--启动运行,跳到下一个断点 F10--逐步调试 F11--逐句调试 F10和F11的区别: method(); int a = 1; 当程序运行到如上面的method方法时,按F10会直接跳到下 ...
- ASP学习笔记1
一.变量 1.1 声明变量 dim name name="Donald Duck" response.write("My name is: " & na ...
- Collection两个常见的集合类型: ArrayList可重复集有序 ,HashSet不可重复集
package seday11; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; ...
- Eclipse配置C++11环境详细介绍
转:https://blog.csdn.net/wgxh05/article/details/54021049 本文记录Eclipse配置C++11开发所有作者遇到的情况,包括跨工程文件编译,内联文件 ...
- 吴裕雄 python 机器学习——数据预处理二元化OneHotEncoder模型
from sklearn.preprocessing import OneHotEncoder #数据预处理二元化OneHotEncoder模型 def test_OneHotEncoder(): X ...
- Python 特殊列表操作记录
1.列表中的NaN数据处理 由于在Excel中筛选数据时,会出现NaN这种数据,所以需要将其删除掉,处理函数如下: 由于NaN数据类型与其他数据类型不一样,所以需要需要根据类型将其去除掉. 2列表关于 ...