Python课程第二天作业
一、统计字符串格式
要求:
# 1.统计元组中所有数据属于字符串的个数,提示: isinstance() # 数据: t1 = (1, 2, '3', '4', 5, '6') # 结果: 3
代码
#统计元组中所有数据属于字符串的个数 def Statistical_String_Number(): count = 0 t1 = (1, 2, '3', '4', 5, '6') for i in t1: if isinstance(i, str): count += 1 print('元组中字符串的个数为:%s'%(count))
二、数据存储为字典类型
要求:
# 2.将以下数据存储为字典类型 # 数据: info = "name:Owen|age:18|gender:男" # 结果: {'name': 'Owen', 'age': 18, 'gender': '男'} # 注:年龄存储为数字类型
代码:
#将字符串存储为字典类型,其中类型为str;类型的数字需要转换为int类型 def String_Conversion(): info = "name:Owen|age:18|gender:男" info_list=info.split('|') info_dict={} for value in info_list: k,v=value.split(':') if v.isdigit(): v=int(v) info_dict[k] = v else: info_dict[k] = v print(info_dict)
三、数据去重
要求:
# 3.完成数据的去重 # 数据: t3 = (1, 2, 1, 2, 3, 5, 9) # 结果: t3 = (1, 2, 3, 5, 9) # 注:从不考虑顺序、考虑顺序两个方面完成
代码:
#数据的去重 def Reduplication_And_Unordering(): value_tuple = (1, 3, 8, -2, 99, 98, 77, 1, 5, 3, 77, 12) #老师给的原始数据有问题,在排序和不排序的情况下最后结果都一致 set_1=set(value_tuple) result_nosort=tuple(set_1) print(result_nosort) #不排序 list_1=list(set_1) list_1=sorted(list_1) result_sort=tuple(list_1) print(result_sort) #排序
四、计算元组中所有可以转换为数字的数据的总和
要求:
# 4.计算元组中所有可以转换为数字的数据的总和 # 数据: t4 = (10, 'abc', '100', '3') # 运算结果: 113
代码:
#计算元组中所有可以转换为数字的数据的总和 def Sum_Of_Numbers(): number_sum = 0 t4 = (10, 'abc', '100', '3','fadf','134',18) for value in t4: value = str(value) if value.isdigit(): value=int(value) number_sum += value print('元组内数据总和为:%d' %(number_sum))
五、将数据转换类型存储
要求:
# 5.将数据转换类型存储 # 原数据: dic = {'name': 'Owen', 'age': 18, 'gender': '男'} # 处理后: info = [('name', 'Owen'), ('age', 18), ('gender', '男')]
代码:
#数据转换类型存储 def Type_Conversion(): dic = {'name': 'Owen', 'age': 18, 'gender': '男'} info=list(dic.items()) print(info)
六、计算元组中所有可以转换为数字的数据的总和
要求:
# 拓展:选做 # 1.计算元组中所有可以转换为数字的数据的总和 # 数据: t4 = (10, 'abc', '100', '3', '壹', '肆', [1000], (10000,)) # 运算结果: 11118 # 提示: # -- 利⽤字符串isnumeric()判断汉字 # -- 利⽤字典{'壹': 1 ...}将汉字转换为数字 # -- 利⽤isinstance()将list和tuple中数据取出来 # -- 先将所有转化为数字的数据存放在⼀个单列集合中,在做运算
代码:
#数据转换类型存储(扩展) def Sum_Of_Numbers_extend(): num_sum = 0 num_list = [] correspond_dict = {'壹':1, '贰':2, '叁':3, '肆':4, '伍':5, '陆':6, '柒':7, '捌':8, '玖':9, '拾':10} t4 = (10, 'abc', '100', '3', '壹', '肆', [1000], (10000,)) for value in t4: if isinstance(value, int): #判断是否是整形,如果是直接添加进数字列表中 num_list.append(value) elif isinstance(value, str): #判断是否是字符串, if value.isdigit(): #判断是否可以别转换为数字,如果可以添加进数字列表中 value=int(value) num_list.append(value) elif value.isnumeric(): #判断是否数字,包含中文、罗马类型数字,如果是则从对应的字典中获取数值加入数字列表中 num_list.append(correspond_dict.get(value)) elif isinstance(value,list): #如果是列表则先取出其中的值 for k1 in value: num_list.append(k1) elif isinstance(value,tuple): #如果是元组则先取出其中的值 for k2 in value: num_list.append(k2) for i in num_list: #计算列表中的数字总和 num_sum += i print('元组内数据总和为:%d' %(num_sum))
七、录⼊电话本
要求:
# 2.完成录⼊电话本 # 需求: ''' -- 从键盘中录⼊姓名(不区分⼤⼩写): -- 姓名必须是全英⽂组成,不是则重新录⼊姓名,如果是q,代表退出 -- 从键盘中再录⼊电话: -- 电话必须为数字且⻓度必须是11位(不能转换为数字) -- 如果出现姓名相同,则保留最后⼀次电话号码 -- 形成的数据是有电话分组的,如:第⼀次录⼊Owen, 13355667788,则会形成 -- { 'O': { 'Owen': '13355667788' } }最终数据,分组名⼀定⼤写: { 'E': { 'egon': '17788990000', 'engo': '16633445566' }, 'O': { 'Owen': '13355667788' } } '''
代码:
#电话本录入 def Telephone_Book(): def Failure_Statistics(count): #错误退出提示函数 if count >= 3: print() print('\033[1;30;41m 失败错误次数过多,程序退出\033[0m') exit(2) user_dict = {} count = 0 while True: name = input('\033[1;30;46m请输入您的姓名:\033[0m ') if name.isalpha(): phone_num=input('\033[1;30;47m请输入您的电话号码:\033[0m ') if (phone_num.isdecimal()) and (len(phone_num) == 11): #如果名称为全英文并且手机号码符合11位 group_name=name[0].upper() if user_dict.get(group_name): #如果该用户的分组存在,则直接写入用户填写的信息 user_dict[group_name][name]=phone_num else: #如果该用户分组不存在,则创建该分组并且写用户填写的信息 user_dict[group_name]={name:phone_num} print() print("\033[1;35m*\033[0m"*60) print('你的用户名为:\033[1;31m%s\033[0m 您的手机号码为:\033[1;31m%s\033[0m 数据录入成功!' % (name, phone_num)) print('当前电话本已有数据为:%s' %user_dict) print("\033[1;35m*\033[0m" * 60) print() elif (phone_num.isdecimal()) and (len(phone_num) != 11): #当用户名称输入正确,手机格式不符合11位时,提示用户 count += 1 Failure_Statistics(count) print('\033[1;31m您输入的手机号码不是有效的手机号码,请重新输入!\033[0m') else: count += 1 Failure_Statistics(count) print('\033[1;31m您输入的手机号码格式不合法,请重新输入!\033[0m') else: count += 1 Failure_Statistics(count) print('\033[1;31m姓名必须是全英⽂组成,请重新输入\033[0m')
八、三级菜单打印:
要求
打印省、市、县三级菜单
可返回上一级
可随时退出程序
流程图:
代码如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- menu = { '北京': ['朝阳区', '海淀区', '西城区', '东城区', '崇文区', '宣武区', '丰台区', '石景山区', '门头沟', '房山区'], '上海': ['黄埔区', '卢湾区', '徐汇区', '长宁区', '静安区', '闸北区', '虹口区', '杨浦区', '宝山区',' 闽行区'], '安徽省': { '合肥市': ['瑶海区', '庐阳区', '蜀山区', '包河区'], '芜湖市': ['镜湖区', '新芜区', '马塘区', '鸠江区'], '淮南市': ['田家庵区', '大通区', '谢家集区', ' 潘集区'], '蚌埠市': ['中市区', '东市区', '西市区', '郊区'], '安庆市': ['迎江区', '大观区', '宜秀区', '宿松县'], '铜陵市': ['铜官山区', '狮子山区', '郊区', '铜陵县'], '黄山市': ['屯溪区', '黄山区', '徽州区', '休宁县'], '宣城市': ['宣州区', '宁国市', '广德县', '郎溪县'] }, '江苏省': { '南京市': ['玄武区', '白下区', '秦淮区', '鼓楼区'], '无锡市': ['崇安区', '南长区', '滨湖区', '北塘区'], '苏州市': ['沧浪区', '平江区', '相城区', '吴中区'], '徐州市': ['鼓楼区', '云龙区', '贾汪区', '泉山区'], '南通市': ['崇川区', '港闸区', '海安县', '如东县'], '盐城市': ['沧城区', '响水县', '滨海县', '阜宁县'], '泰州市': ['海陵区', '高港区', '兴化市', '靖江市'], '宿迁市': ['宿城区', '宿豫县', '沭阳县', '泗阳县'], }, '浙江省': { '杭州市': ['上城区', '下城区', '江干区', '西湖区'], '湖州市': ['市辖区', '德清县', '长兴县', '安吉县'], '嘉兴市': ['秀城区', '秀洲区', '海宁市', '平湖市'], '绍兴市': ['越城区', '诸暨市', '上虞市', '绍兴县'], '衢州市': ['柯城区', '衢江区', '江山市', '龙游县'], '宁波市': ['海曙区', '江东区', '江北区', '北仑区'], '温州市': ['鹿城区', '龙湾区', '瑞安市', '乐清市'], '金华市': ['婺城区', '金东区', '义乌市', '武义县'], } } number_and_provincial_correspondence = {} #省字典 {0: '北京', 1: '上海', 2: '安徽省', 3: '江苏省', 4: '浙江省'} province_list=list(menu.keys()) #将所有省/直辖市写入列表中 for k, v in enumerate(menu): number_and_provincial_correspondence[k] = v #获取省/直辖市列表 province_length=len(number_and_provincial_correspondence) #获取省/直辖市的个数,用于后续打印 def main(): count = 0 print('''\033[1;31;40m欢迎进入全国城市查询系统,目前仅支持以下省/直辖市查询:\033[0m''') while True: for province in range(province_length): #循环 省/直辖市 列表 print(province,number_and_provincial_correspondence[province]) #打印所有省份信息供用户选择 province_choose = input('\033[1;30;42m根据数字提示,请选择您要查询的省/直辖市,选择"q/Q"退出:\033[0m') #根据用户的选择,执行相应的操作 if province_choose == 'q' or province_choose == 'Q': #退出 exit(2) elif province_choose.isdigit() == False or (int(province_choose) > province_length or int(province_choose) < 0) : #判断选择的数字是否在合法范围 count += 1 if count > 2: print('\033[1;31;40m错误次数过多,程序退出!\033[0m') exit(2) print('\033[1;30;41m无效的选项,请重新输入\033[0m') else: province_choose = int(province_choose) city_list=menu.get(province_list[province_choose]) #获取所在省/直辖市市级列表 city_length = len(city_list) if type(city_list) == list: # 获取所在省份城市个数 print('\033[1;31m%s辖区列表:\033[0m'%(number_and_provincial_correspondence[province_choose])) print('\033[1;34;46m=\033[0m'*50) for city in range(city_length-1): print(city,city_list[city]) print() other_choose = input('\033[1;30;42m返回上一层请按\'r/R\',退出请按"q/Q":\033[0m') if other_choose == 'r' or other_choose == 'R': continue elif other_choose == 'q' or other_choose == 'Q': exit(2) else: count += 1 if count > 2: print('\033[1;31;40m错误次数过多,程序退出!\033[0m') exit(2) print('\033[1;31;40m无效的输入,请重新输入\033[0m') elif type(city_list) == dict: while True: district_and_county_list = [] # 用于存放与省对应的城市名称,每次用户返回后需要情况列表 print('\033[1;31m%s 辖区列表:\033[0m' % (number_and_provincial_correspondence[province_choose])) print('\033[1;34;46m=\033[0m' * 50) for city_num,city in enumerate(city_list): print(city_num,city) district_and_county_list.append(city) #将用户所选省份的城市添加入列表中 city_choose = input('\033[1;30;42m 根据数字提示,请选择您要查询的城市信息,返回上一层请按\'r/R\',退出请按"q/Q":\033[0m') if city_choose == 'r' or city_choose == 'R': break elif city_choose == 'q' or city_choose == 'Q': exit(2) elif city_choose.isdigit() == False or (int(city_choose) > province_length or int(city_choose) < 0): # 判断选择的数字是否在合法范围 count += 1 if count > 2: print('\033[1;31;40m错误次数过多,程序退出!\033[0m') exit(2) print('\033[1;31;40m无效的选项,请重新输入\033[0m!') else: city_choose = int(city_choose) district_and_county_lenght = len(city_list.get(district_and_county_list[city_choose])) #获取该市区和县的个数 district_and_county =city_list.get(district_and_county_list[city_choose]) #获取当前用户选择的城市 for district_and_county_num in range(district_and_county_lenght): print(district_and_county_num,district_and_county[district_and_county_num]) last_choose = input('\033[1;30;42m 已经到最后啦!返回上一层请按\'r/R\',退出请按"q/Q":\033[0m') if last_choose == 'r' or last_choose == 'R': continue elif last_choose == 'q' or last_choose == 'Q': exit(2) else: # 判断选择的数字是否在合法范围 count += 1 if count > 2: print('\033[1;31;40m错误次数过多,程序退出!\033[0m') exit(2) print('\033[1;31;40m无效的选项,请重新输入!\033[0m') if __name__ == '__main__': main()
九、购物车小程序
要求:
用户名和密码存放于文件中,格式为:egon|egon123 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额
流程图:
代码如下:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 import time 4 import random 5 white_user_set=[] 6 black_user_set=[] 7 user_list=[] 8 white_userDB='white_userDB' 9 black_userDB='black_userDB' 10 11 with open(black_userDB, 'r+') as black_f: 12 for black_user in black_f.readlines(): 13 black_user = black_user.strip("\n") 14 black_user_set.append(black_user) 15 16 with open(white_userDB, 'r+') as white_f: 17 for file in white_f.readlines(): 18 file = file.strip("\n") 19 user,passwd,balance= file.split(':') 20 white_user_set.append({'name':user,'passwd':passwd,'balance':balance}) 21 user_list.append(user) 22 23 def user_register(): 24 count=0 25 init_money=str(random.randrange(10000,99999)) 26 while True: 27 count+=1 28 register_name = input('创建用户名:') 29 register_passwd = input('创建密码:') 30 register_passwd1 = input('创建密码:') 31 if register_passwd == register_passwd1: 32 if register_name in user_list: 33 print('\033[1;31;40m用户已存在,请重新创建\033[0m') 34 else: 35 user_information=register_name+':'+register_passwd+':'+init_money 36 with open(white_userDB,'a+') as f: 37 f.write('\n') 38 f.write(user_information) 39 print('\033[32m恭喜您,用户创建成功!!!\033[0m') 40 return 0 41 else: 42 if count == 3: 43 print('\033[1;31;40m失败次数超过上限,程序退出\033[0m') 44 exit(3) 45 print('\033[1;31;40m两次密码不一致,请重新创建2\033[0m') 46 47 def user_login(): 48 Flag = True 49 user_failures = 0 50 all_failures = 0 51 while Flag: 52 login_name = input('请输入用户名:') 53 login_passwd = input('输入密码:') 54 if login_name in black_user_set: 55 print('\033[1;31;40m该用户已被锁定,请联系您的管理员!\033[0m') 56 exit(3) 57 if login_name in user_list: 58 for subscript,line in enumerate(white_user_set): 59 if (login_name == line['name']) and (login_passwd == line['passwd']): 60 print('\033[31m正在登录。请稍后\033[0m') 61 time.sleep(1) 62 print('') 63 print('\033[36m=\033[0m'*50) 64 print('\033[36m 欢迎来到 澳门皇家商城\033[0m') 65 print('\033[36m=\033[0m'*50) 66 user_balance=line['balance'] 67 return (login_name,user_balance) 68 for subscript,line in enumerate(white_user_set): 69 if (login_name == line['name']) and (login_passwd != line['passwd']): 70 user_failures += 1 71 all_failures += 1 72 if (user_failures == 3): 73 print('\033[1;31;40m验证失败次数过多,用户被锁定\033[0m') 74 with open(black_userDB,'a+') as f: 75 f.write(login_name+'\n') 76 exit(2) 77 print('\033[1;31;40m用户名或密码不正确,登录失败,请重新登录 \033[0m') 78 break 79 else: 80 print('\033[1;31;40m用户名或密码不正确,登录失败,请重新登录 \033[0m') 81 all_failures += 1 82 if all_failures == 6: 83 print('\033[1;31;40m失败次数过多,请确认后再登录 \033[0m') 84 exit(1) 85 86 def login_system(): 87 while True: 88 count=0 89 print('\033[32m1 注册用户:\033[0m') 90 print('\033[32m2 登录系统:\033[0m') 91 user_operation=input('\033[32m请选择您的操作:\033[0m') 92 if user_operation == '1': 93 user_register() 94 break 95 elif user_operation == '2': 96 login_name, user_balance=user_login() 97 return (login_name,user_balance) 98 else: 99 count+=1 100 if count == 3: 101 print('\033[1;31;40m失败次数过多,请确认后再登录\033[0m') 102 exit(3) 103 print('\033[1;31;40m非法的输入,请重试\033[0m') 104 # 105 # if __name__ == '__main__': 106 # main()
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 import time 4 import user_login 5 from prettytable import PrettyTable 6 7 sub_list = {} # 用户存放子类商品的序号及名称 8 name_and_price={} #用于存放子商品下每个子类中的商品名称和价格 9 serial_number={} 10 shopping_list={} 11 price_list=[] 12 commodities_list=[] 13 costs=0 14 15 list_Of_commodities = { 16 'phone': { 17 'Huawei': 18 { 19 'HUAWEI P30 Pro':13333, 20 'HUAWEI Mate X':9999, 21 'HUAWEI Mate 20':7999, 22 'HUAWEI Mate 10':5999 23 }, 24 'Apple': { 25 'iPhone XS':8699, 26 'iPhoneXR':6499, 27 'iPhone8Plus':4699, 28 'iPhone7 Plus':3299 29 }, 30 'millet':{ 31 '小米9': 2999, 32 '小米8':1599, 33 '小米play':1099, 34 '红米6A':549 35 }, 36 'NOKIA': { 37 'Nokia 9 PureView':9999, 38 'Nokia 7 Plus':1799, 39 'Nokia X6':999, 40 'Nokia 3.1 Plus':769 41 } 42 }, 43 'computer': 44 { 45 'DELL': { 46 'DELL Precision 7730':89999, 47 'DELL Precision 7430':41999, 48 'DELL XPS15-9560-R184':14999, 49 'DELL Latitude5491':9899 50 }, 51 'HUAWEI':{ 52 'MateBook X Pro':8688, 53 'MateBook E':7388, 54 'MateBook 13':5699, 55 '荣耀MagicBook':3699 56 }, 57 'millet':{ 58 '小米游戏本':6699, 59 '小米笔记本 Pro':5599, 60 '小米笔记本 Air':4999, 61 '小米笔记本':4199 62 } 63 }, 64 'Daily supplies': { 65 'Jacket':{ 66 'Armani':8888, 67 'Prada':3888, 68 'Gucci':1888, 69 'CK':888 70 }, 71 'Trousers':{ 72 'Louis Vuitton':9998, 73 'CHANEL':6888, 74 'GUCCI':3888, 75 'PRADA':2888 76 }, 77 'Skirt':{ 78 'Disney':1888, 79 'Snoopy':1388, 80 'Balabala':988, 81 'BOBDOG':388 82 }, 83 'red wine': { 84 'Romani': 8998, 85 'Merlot': 6666, 86 'Latour': 3666, 87 'Lafite': 888 88 } 89 }, 90 91 92 } 93 def Choice_judgment(max_times): 94 bill_details = PrettyTable() 95 count=0 96 while count < 3 : 97 user_chose = input('\033[1;30;42m请根据相应的序号选择对应的商品,[s/S]查询当前已购买商品信息 [q/Q]退出程序:\033[0m') 98 if user_chose == 'q' or user_chose == 'Q': # 退出 99 print('\033[1;31;40m程序退出\033[0m') 100 exit(2) 101 elif user_chose == 's' or user_chose == 'S': # 退出 102 if shopping_list: 103 print('\033[31m您当前已购买商品如下:\033[0m') 104 for k,v in shopping_list.items(): 105 bill_details.add_row([k,v]) 106 bill_details._set_field_names(['商品名称','价格']) 107 print('\033[36m%s\033[0m' %bill_details) 108 print('\033[31m总共花费为:%s 剩余金额为:%s\033[0m'%(costs,user_balance)) 109 print('\033[31m返回主页面,请稍后\033[0m') 110 time.sleep(2) 111 print() 112 print() 113 else: 114 print('\033[31m您尚未购买任何商品,余额为%s\033[0m'%(user_balance)) 115 return False 116 elif user_chose.isdigit() == False or ( int(user_chose) > max_times or int(user_chose) < 0) or user_chose == False: # 判断选择的数字是否在合法范围 117 count += 1 118 if count >=3: 119 print('\033[1;31;40m错误次数过多,程序退出\033[0m') 120 exit(2) 121 print('\033[1;30;41m无效的选项,请重新输入\033[0m') 122 else: 123 user_chose= int(user_chose) 124 return user_chose 125 126 def get_serial_and_product(): 127 master_list={} 128 classification=PrettyTable() 129 for k1,v1 in enumerate(list_Of_commodities,start=1): 130 master_list[k1]=v1 #获取商品序号及种类名称 131 classification.add_row([k1,v1]) 132 master_len=len(master_list) #商品种类的格式 133 classification._set_field_names(['序号','类别(大类)']) 134 print('\033[34m%s\033[0m' %classification) #打印商品列表 135 return (master_len,master_list) 136 137 def get_subcategory_info(): 138 subclass = PrettyTable() 139 for k2,v2 in enumerate(sub_name_list,start=1): 140 sub_list[k2]=v2 #子商品序号及名称 141 subclass.add_row([k2,v2]) 142 subclass._set_field_names(['序号','类别(子类)']) 143 print('\033[35m%s\033[0m' %subclass) 144 145 def get_commodity_price(): 146 commodity_price = PrettyTable() 147 count=1 148 for k3,v3 in list_Of_commodities[trade_name][sub_name].items(): 149 serial_number[count]=k3 150 name_and_price[k3]=v3 151 commodity_price.add_row([count,k3,v3]) 152 count += 1 153 commodity_price._set_field_names(['序号','名称','价格']) 154 print('\033[36m%s\033[0m' %commodity_price) 155 return serial_number 156 157 158 login_name,user_balance=user_login.login_system() 159 print('\033[47m您的登陆用户名为:\033[31m %s \033[47m您的当前余额为 \033[31m%s \033[0m' %(login_name,user_balance)) 160 while True: 161 serial,master_list = get_serial_and_product() 162 result=Choice_judgment(serial) # 用户选择的数字 163 if result==False: 164 continue 165 else: 166 trade_name = master_list[result] # 用户选择的商品种类 167 168 sub_len=len(list_Of_commodities.get(master_list[result])) #子商品种类个数 169 sub_name_list=list_Of_commodities.get(master_list[result]) #子商品信息 170 171 get_subcategory_info() 172 sub_result=Choice_judgment(sub_len) #用户选择的数字 173 sub_name=sub_list[sub_result] #用户选择的商品子类 174 175 176 name_len=len(get_commodity_price()) #子类商品个数 177 name_result=Choice_judgment(name_len) 178 user_balance=int(user_balance) 179 current_price=name_and_price[serial_number[name_result]] 180 if current_price > user_balance: 181 print() 182 print('\033[1;30;41m余额不足,当前的商品价格为%s 当前的余额为:%s ,请重新购买\033[0m'%(current_price,user_balance)) 183 print() 184 print() 185 time.sleep(1) 186 continue 187 else: 188 user_balance -= current_price 189 shopping_list[serial_number[name_result]]=current_price 190 for cost in shopping_list.values(): 191 costs += cost 192 print() 193 print() 194 time.sleep(1) 195 print('''\033[1;31;40m您当前购买的商品为: %s 价格为:%s \033[0m'''%(serial_number[name_result],current_price)) 196 print('\033[1;31;40m=\033[0m'*50) 197 print('\033[1;31;40m '*37+'剩余金额:%s \033[0m'%user_balance) 198 print() 199 print() 200 time.sleep(2)
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少