第一天的程序作业
需求:一个登录验证程序,密码输错3次后将锁定用户;
程序实现流程:
1、程序运行,读取./user_list文件; 2、用户交互,输入用户名或q; 3、判断输入的用户名是否存在于./user_list中或者是否为字母q: 3.1 存在,则判断此用户的错误登录计数是否超过3次; 3.1.1 不超过3次,输入密码或字母q; 3.1.2 超过3次,返回第2步; 3.2 q,退出系统; 3.3 不存在,返回第2步; 4、判断输入的密码是否正确或者是否为字母q: 4.1 正确,打印“登录成功”,并将错误登录计数归零; 4.2 不正确,返回第3.1步; 4.3 q,退出系统,并记录登录错误次数; 5、将修改写入./user_list,程序结束。
user_list文件内容如下:
cgy|123456|0cxp|123456|0cjc|123456|0lisi|123|0wangwu|123|0
第1版程序代码如下:

1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 # Author : Cai Guangyin 4 # 读取用户列表文件user_list数据 5 user_list = open('user_list','r') 6 data = user_list.read() 7 user_list.close() 8 9 # 将user_list文件数据生成列表 10 user_str_list = data.split('\n') 11 12 # 将用户名,密码,错误次数以字典的形式保存至user_info_list 13 user_info_list = [] 14 for item in user_str_list: 15 item = item.split('|') 16 user_dic = { 17 'name':item[0], 18 'pwd':item[1], 19 'times':item[2] 20 } 21 user_info_list.append(user_dic) 22 23 user_mark = 0 # 判断用户是否存在的标记,存在为0,不存在为1 24 pwd_mark = 0 # 判断密码是否正确的标记,正确为0,不正确为1 25 26 exit_flag = False # 退出标志位 27 while not exit_flag : # 非假,进入循环;非假即为真 28 username = input('请输入用户名或q 键退出:') 29 for user_info in user_info_list: # 循环,判断用户输入的用户名是否存在 30 if username == user_info['name']: 31 user_mark = 0 # 当输入的用户存在时,将此标记设置为0 32 while int(user_info['times']) < 3: # 密码错误次数不超过3次 33 pwd = input('请输入密码或q键退出:') 34 if pwd == user_info['pwd']: # 判断输入的密码是否正确 35 print('登录成功!') 36 user_info['times'] = '0' # 登录成功,就将记数初始化为0 37 pwd_mark = 0 # 登录成功,就将密码标记设为0 38 exit_flag = True # 登录成功后,跳出循环 39 break 40 elif pwd == 'q': 41 print('=== 退出登陆系统 ===') 42 user_info['times'] = str(user_info['times']) 43 exit_flag = True 44 break 45 else: 46 user_info['times'] = int(user_info['times']) + 1 # 输错一次密码,计数加1 47 user_info['times'] = str(user_info['times']) 48 if int(user_info['times']) < 3: 49 print('密码错误,请重新输入!') 50 else: 51 print('密码错误!') 52 print('警告:密码已输错 \033[31;1m%s\033[0m 次,错误3次后,用户将被锁定,请谨慎!' % (user_info['times'])) 53 else: 54 pwd_mark = 1 55 break 56 else: 57 pwd_mark = 0 58 user_mark = 1 59 if username == 'q': 60 print('=== 退出登陆系统 ===') 61 break 62 if user_mark == 1: 63 print('用户不存在') 64 if pwd_mark == 1: 65 print('用户“%s”已锁定,请联系管理员'%username) 66 67 # 取出user_info_list中的values,保存至列表new_user_list 68 new_user_list = [] 69 for new in user_info_list: 70 new_user = [] 71 new_user.append(new['name']) 72 new_user.append(new['pwd']) 73 new_user.append(new['times']) 74 new_user_list.append(new_user) 75 76 # 将数据格式化成user_list文件保存数据的格式 77 format = [] 78 for i in new_user_list: 79 temp = '|'.join(i) 80 format.append(temp) 81 82 # 将新数据写入user_list文件中 83 last_data = '\n'.join(format) 84 f2 = open('user_list','w') 85 f2.write(last_data) 86 f2.close()
第2版,优化后:

1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 # Author: Cai Guangyin 4 # discription : login4 是login3 的改进版本,优化了部分代码 5 6 # 打开并读取user_list文件,存入data 7 f1 = open('user_list','r') 8 data = f1.read() 9 f1.close() 10 11 # 以列表的形式保存文件内容到user_info 12 user_info = data.split() 13 user_info_list = [] 14 15 # 将列表转换成字典 16 for i in user_info: 17 i = i.split('|') 18 user_info_list.append({ 19 'name': i[0], 20 'pwd': i[1], 21 'times': i[2] 22 }) 23 24 # 退出循环标记 25 exit_flag = True 26 # 错误用户记数 27 flag = 0 28 29 while exit_flag and flag < 3: 30 username = input('请输入用户名或q(退出):') 31 if username != 'q': 32 for item in user_info_list: 33 if username == item['name']: 34 while int(item['times']) < 3: 35 pwd = input('请输入密码或q(退出):') 36 if pwd == item['pwd']: 37 print('===== 登录成功 =====') 38 item['times'] = 0 39 exit_flag = False 40 break 41 elif pwd == 'q': 42 print('==== 退出系统 ====') 43 exit_flag = False 44 break 45 else: 46 print('===== 密码错误,请重新输入 =====') 47 item['times'] = int(item['times']) + 1 48 else: 49 print('用户已锁定') 50 break 51 break 52 else: 53 print('用户不存在!') 54 flag += 1 55 if flag >= 3: 56 print('您尝试的次数过多,退出') 57 else: 58 a = '退出系统' 59 print(a.center(30,'=')) 60 exit_flag = False 61 62 # 格式化用户信息 63 temp_user_list = [] 64 for item in user_info_list: 65 detail = '%s|%s|%s' % (item['name'], item['pwd'], item['times']) 66 temp_user_list.append(detail) 67 temp_list = '\n'.join(temp_user_list) 68 69 f2 = open('user_list','w') 70 f2.write(temp_list) 71 f2.close()
练习题:
1. 元素分类
有如下值集合 v1 = [11,22,33,44,55,66,77,88,99,90],
将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
v2 = {'k1': [],'k2':[] }

1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 # a.元素分类 4 v1 = [11,22,33,44,55,66,77,88,99,90] 5 v2 = {'k1':[],'k2':[]} 6 for i in v1: 7 if i < 66: 8 v2['k1'].append(i) 9 else: 10 v2['k2'].append(i) 11 print(v2)
2. 功能要求:
要求用户输入总资产,例如:2000;
显示商品列表,让用户根据序号选择商品,加入购物车购买;
如果商品总额大于总资产,提示账户余额不足,否则,购买成功。
goods = [
{"name": "电脑", "price": 1999},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 20},
{"name": "美女", "price": 998},
]

1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 goods = [ 4 {"name": "电脑", "price": 1999}, 5 {"name": "鼠标", "price": 10}, 6 {"name": "游艇", "price": 20}, 7 {"name": "美女", "price": 998}, 8 ] 9 salary = input('总资产:') 10 list = [] 11 shopping_cart = [] 12 if salary.isnumeric(): 13 salary = int(salary) 14 for i in goods: 15 item = [] 16 item.append(i['name']) 17 item.append(i['price']) 18 list.append(item) 19 # for x in list: # 此方法与下面的方法输出结果一致 20 # print(list.index(x),x) 21 print('----- 商品列表 ------') 22 for index,goods_list in enumerate(list): 23 print(index,goods_list) 24 while True: 25 choice_id = input('选择商品或退出(q):') 26 if choice_id.isdigit(): 27 choice_id = int(choice_id) 28 if choice_id < len(list): 29 if salary >= list[choice_id][1]: 30 shopping_cart.append(list[choice_id]) 31 salary -= list[choice_id][1] 32 print('已添加 "%s" 至购物车,余额:\033[31;1m%s\033[0m'% (list[choice_id][0],salary)) 33 else: 34 print('余额不足') 35 else: 36 print('商品不存在') 37 elif choice_id == 'q': 38 print('余额:\033[31;1m%s\033[0m, 已购买的商品:'% salary) 39 for id, al_shop in enumerate(shopping_cart): 40 print(id, al_shop) 41 exit('退出') 42 else: 43 print('Invalid option') 44 else: 45 print('输入无效')
3.用户交互,显示省市县三级联动的选择
dic = { '河北':{ '石家庄':['鹿泉','藁城','元氏'], '邯郸':['永年','涉县','磁县'], }, '湖北':{ '十堰':['茅箭','郧西','张湾'], '襄阳':['襄城','樊城','南鄣'], }, '北京':{ '朝阳':['北苑','大屯','奥运村'], '昌平':['回龙观','天通苑','立水桥'], },}

1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 4 # c.用户交互,显示省市县三级联动的选择 5 dic = { 6 '河北':{ 7 '石家庄':['鹿泉','藁城','元氏'], 8 '邯郸':['永年','涉县','磁县'], 9 }, 10 '湖北':{ 11 '十堰':['茅箭','郧西','张湾'], 12 '襄阳':['襄城','樊城','南鄣'], 13 }, 14 '北京':{ 15 '朝阳':['北苑','大屯','奥运村'], 16 '昌平':['回龙观','天通苑','立水桥'], 17 }, 18 } 19 20 while True: 21 print('-------- 省列表 -------') 22 for province in dic: 23 print(province) 24 prov = input('请输入省,q 退出:') 25 if prov in dic: 26 while True: 27 print('-------- 市列表 --------') 28 for city_list in dic[prov].keys(): 29 print('\t',city_list) 30 choice_city = input('请选择市,b 返回:') 31 if choice_city in dic[prov].keys(): 32 print('------- 县列表 -------') 33 while True: 34 for county_list in dic[prov][choice_city]: 35 print('\t\t',county_list) 36 choice_county = input('请选择县, b 返回:') 37 if choice_county in dic[prov][choice_city]: 38 print('您选择的是:%s省,%s市,%s县'% (prov,choice_city,choice_county)) 39 quit = input('您还想继续吗?q 退出,b 返回,其它键继续:') 40 if quit == 'q': 41 exit('不玩了') 42 elif quit == 'b': 43 break 44 elif choice_county == 'b': 45 break 46 else: 47 print('您选择的县不存在') 48 #break 49 elif choice_city == 'b': 50 break 51 else: 52 print('您选择的市不存在') 53 #break 54 elif prov == 'q': 55 print('===== 退出系统 =====') 56 break 57 else: 58 print('您输入的省不存在')
来源:https://www.cnblogs.com/caigy/p/6816416.html