一、统计字符串格式
要求:
# 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()