day01 作业,练习题

我的梦境 提交于 2019-12-19 23:54:23

第一天的程序作业

需求:一个登录验证程序,密码输错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()
第1版,login3.py

第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()
第2版,login4.py

 

练习题:

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('您输入的省不存在')
三级联动

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!