一、统计字符串格式
要求:
# 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
启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序
允许用户根据商品编号购买商品
用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
可随时退出,退出时,打印已购买商品和余额
流程图:
代码如下:
#!/usr/bin/env python
# -*- coding: utf- -*-
import time
import random
white_user_set=[]
black_user_set=[]
user_list=[]
white_userDB='white_userDB'
black_userDB='black_userDB' with open(black_userDB, 'r+') as black_f:
for black_user in black_f.readlines():
black_user = black_user.strip("\n")
black_user_set.append(black_user) with open(white_userDB, 'r+') as white_f:
for file in white_f.readlines():
file = file.strip("\n")
user,passwd,balance= file.split(':')
white_user_set.append({'name':user,'passwd':passwd,'balance':balance})
user_list.append(user) def user_register():
count=
init_money=str(random.randrange(,))
while True:
count+=
register_name = input('创建用户名:')
register_passwd = input('创建密码:')
register_passwd1 = input('创建密码:')
if register_passwd == register_passwd1:
if register_name in user_list:
print('\033[1;31;40m用户已存在,请重新创建\033[0m')
else:
user_information=register_name+':'+register_passwd+':'+init_money
with open(white_userDB,'a+') as f:
f.write('\n')
f.write(user_information)
print('\033[32m恭喜您,用户创建成功!!!\033[0m')
return
else:
if count == :
print('\033[1;31;40m失败次数超过上限,程序退出\033[0m')
exit()
print('\033[1;31;40m两次密码不一致,请重新创建2\033[0m') def user_login():
Flag = True
user_failures =
all_failures =
while Flag:
login_name = input('请输入用户名:')
login_passwd = input('输入密码:')
if login_name in black_user_set:
print('\033[1;31;40m该用户已被锁定,请联系您的管理员!\033[0m')
exit()
if login_name in user_list:
for subscript,line in enumerate(white_user_set):
if (login_name == line['name']) and (login_passwd == line['passwd']):
print('\033[31m正在登录。请稍后\033[0m')
time.sleep()
print('')
print('\033[36m=\033[0m'*)
print('\033[36m 欢迎来到 澳门皇家商城\033[0m')
print('\033[36m=\033[0m'*)
user_balance=line['balance']
return (login_name,user_balance)
for subscript,line in enumerate(white_user_set):
if (login_name == line['name']) and (login_passwd != line['passwd']):
user_failures +=
all_failures +=
if (user_failures == ):
print('\033[1;31;40m验证失败次数过多,用户被锁定\033[0m')
with open(black_userDB,'a+') as f:
f.write(login_name+'\n')
exit()
print('\033[1;31;40m用户名或密码不正确,登录失败,请重新登录 \033[0m')
break
else:
print('\033[1;31;40m用户名或密码不正确,登录失败,请重新登录 \033[0m')
all_failures +=
if all_failures == :
print('\033[1;31;40m失败次数过多,请确认后再登录 \033[0m')
exit() def login_system():
while True:
count=
print('\033[32m1 注册用户:\033[0m')
print('\033[32m2 登录系统:\033[0m')
user_operation=input('\033[32m请选择您的操作:\033[0m')
if user_operation == '':
user_register()
break
elif user_operation == '':
login_name, user_balance=user_login()
return (login_name,user_balance)
else:
count+=
if count == :
print('\033[1;31;40m失败次数过多,请确认后再登录\033[0m')
exit()
print('\033[1;31;40m非法的输入,请重试\033[0m')
#
# if __name__ == '__main__':
# main()
user_login.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import user_login
from prettytable import PrettyTable sub_list = {} # 用户存放子类商品的序号及名称
name_and_price={} #用于存放子商品下每个子类中的商品名称和价格
serial_number={}
shopping_list={}
price_list=[]
commodities_list=[]
costs=0 list_Of_commodities = {
'phone': {
'Huawei':
{
'HUAWEI P30 Pro':13333,
'HUAWEI Mate X':9999,
'HUAWEI Mate 20':7999,
'HUAWEI Mate 10':5999
},
'Apple': {
'iPhone XS':8699,
'iPhoneXR':6499,
'iPhone8Plus':4699,
'iPhone7 Plus':3299
},
'millet':{
'小米9': 2999,
'小米8':1599,
'小米play':1099,
'红米6A':549
},
'NOKIA': {
'Nokia 9 PureView':9999,
'Nokia 7 Plus':1799,
'Nokia X6':999,
'Nokia 3.1 Plus':769
}
},
'computer':
{
'DELL': {
'DELL Precision 7730':89999,
'DELL Precision 7430':41999,
'DELL XPS15-9560-R184':14999,
'DELL Latitude5491':9899
},
'HUAWEI':{
'MateBook X Pro':8688,
'MateBook E':7388,
'MateBook 13':5699,
'荣耀MagicBook':3699
},
'millet':{
'小米游戏本':6699,
'小米笔记本 Pro':5599,
'小米笔记本 Air':4999,
'小米笔记本':4199
}
},
'Daily supplies': {
'Jacket':{
'Armani':8888,
'Prada':3888,
'Gucci':1888,
'CK':888
},
'Trousers':{
'Louis Vuitton':9998,
'CHANEL':6888,
'GUCCI':3888,
'PRADA':2888
},
'Skirt':{
'Disney':1888,
'Snoopy':1388,
'Balabala':988,
'BOBDOG':388
},
'red wine': {
'Romani': 8998,
'Merlot': 6666,
'Latour': 3666,
'Lafite': 888
}
}, }
def Choice_judgment(max_times):
bill_details = PrettyTable()
count=0
while count < 3 :
user_chose = input('\033[1;30;42m请根据相应的序号选择对应的商品,[s/S]查询当前已购买商品信息 [q/Q]退出程序:\033[0m')
if user_chose == 'q' or user_chose == 'Q': # 退出
print('\033[1;31;40m程序退出\033[0m')
exit(2)
elif user_chose == 's' or user_chose == 'S': # 退出
if shopping_list:
print('\033[31m您当前已购买商品如下:\033[0m')
for k,v in shopping_list.items():
bill_details.add_row([k,v])
bill_details._set_field_names(['商品名称','价格'])
print('\033[36m%s\033[0m' %bill_details)
print('\033[31m总共花费为:%s 剩余金额为:%s\033[0m'%(costs,user_balance))
print('\033[31m返回主页面,请稍后\033[0m')
time.sleep(2)
print()
print()
else:
print('\033[31m您尚未购买任何商品,余额为%s\033[0m'%(user_balance))
return False
elif user_chose.isdigit() == False or ( int(user_chose) > max_times or int(user_chose) < 0) or user_chose == False: # 判断选择的数字是否在合法范围
count += 1
if count >=3:
print('\033[1;31;40m错误次数过多,程序退出\033[0m')
exit(2)
print('\033[1;30;41m无效的选项,请重新输入\033[0m')
else:
user_chose= int(user_chose)
return user_chose def get_serial_and_product():
master_list={}
classification=PrettyTable()
for k1,v1 in enumerate(list_Of_commodities,start=1):
master_list[k1]=v1 #获取商品序号及种类名称
classification.add_row([k1,v1])
master_len=len(master_list) #商品种类的格式
classification._set_field_names(['序号','类别(大类)'])
print('\033[34m%s\033[0m' %classification) #打印商品列表
return (master_len,master_list) def get_subcategory_info():
subclass = PrettyTable()
for k2,v2 in enumerate(sub_name_list,start=1):
sub_list[k2]=v2 #子商品序号及名称
subclass.add_row([k2,v2])
subclass._set_field_names(['序号','类别(子类)'])
print('\033[35m%s\033[0m' %subclass) def get_commodity_price():
commodity_price = PrettyTable()
count=1
for k3,v3 in list_Of_commodities[trade_name][sub_name].items():
serial_number[count]=k3
name_and_price[k3]=v3
commodity_price.add_row([count,k3,v3])
count += 1
commodity_price._set_field_names(['序号','名称','价格'])
print('\033[36m%s\033[0m' %commodity_price)
return serial_number login_name,user_balance=user_login.login_system()
print('\033[47m您的登陆用户名为:\033[31m %s \033[47m您的当前余额为 \033[31m%s \033[0m' %(login_name,user_balance))
while True:
serial,master_list = get_serial_and_product()
result=Choice_judgment(serial) # 用户选择的数字
if result==False:
continue
else:
trade_name = master_list[result] # 用户选择的商品种类 sub_len=len(list_Of_commodities.get(master_list[result])) #子商品种类个数
sub_name_list=list_Of_commodities.get(master_list[result]) #子商品信息 get_subcategory_info()
sub_result=Choice_judgment(sub_len) #用户选择的数字
sub_name=sub_list[sub_result] #用户选择的商品子类 name_len=len(get_commodity_price()) #子类商品个数
name_result=Choice_judgment(name_len)
user_balance=int(user_balance)
current_price=name_and_price[serial_number[name_result]]
if current_price > user_balance:
print()
print('\033[1;30;41m余额不足,当前的商品价格为%s 当前的余额为:%s ,请重新购买\033[0m'%(current_price,user_balance))
print()
print()
time.sleep(1)
continue
else:
user_balance -= current_price
shopping_list[serial_number[name_result]]=current_price
for cost in shopping_list.values():
costs += cost
print()
print()
time.sleep(1)
print('''\033[1;31;40m您当前购买的商品为: %s 价格为:%s \033[0m'''%(serial_number[name_result],current_price))
print('\033[1;31;40m=\033[0m'*50)
print('\033[1;31;40m '*37+'剩余金额:%s \033[0m'%user_balance)
print()
print()
time.sleep(2)
shop_cat.py