第八章 购物车与三级菜单
购物车与三级菜单
1.购物车
购物车程序:
1.启动程序后,先登录,登录成功则打印商品列表,失败则重新登录,超过三次则密码输入错误3次锁定5秒,请5秒后再登录
2.允许用户根据商品编号购买商品,用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
3.可结账,结账时,打印已购买商品和用户信息
1.1.数据部分
# 1.熟悉python的语法规则,巩固day1到day7的知识点
# 2.业务逻辑
import time
# time.sleep(5)
# print('休息5秒')
user_dic = {
'name':'大海',
'password':'123a',
'locked':False,
'account':50000,
'shopping_cart':{}
}
1.2.登录部分
def login():
'''
登录函数,密码输入错误3次锁定5秒,用户名输入错误可以一直输入
:return:
'''
print('请登录')
# 密码错误的次数
count = 0
while True:
# 密码错误三次会走 if user_dic['locked']:
if user_dic['locked']:
print('密码输入错误3次锁定5秒,请5秒后再登录')
time.sleep(5)
user_dic['locked'] = False
count = 0
name = input('输入用户名').strip()
if name == user_dic['name']:
pwd = input('输入密码').strip()
if user_dic['password'] == pwd and user_dic['locked'] == False:
print('登录成功')
break
else:
print('密码错误')
count +=1
else:
print('用户名不存在')
if count >= 3:
user_dic['locked'] = True
1.3.购物部分
# login()
def shopping():
print('购物')
goods_list = [
['coffee', 30], # 0
['chicken', 20], # 1
['iPhone', 10000], # 2
['car', 100000], # 3
['building', 200000] # 4
]
shopping_cart = {}
cost_money = 0
while True:
# 展示商品
# enumerate 枚举
for i,itme in enumerate(goods_list):
# i是列表的索引号
# item是列表里面的数据
print(i,itme)
# for循环
# for循环已经运行完毕
choice = input('输入商品对应的编号,按t键结账').strip()
if choice.isdigit():
# 判断字符串是否是数字
# 进入了这个里面,字符串的数字
# print('是数字')
# 现在输入的是字符串的数字
choice = int(choice)
# 否定的条件 不能是那些数字
if choice < 0 or choice >= len(goods_list):
print('请输入相应的编号')
continue
# print('这个是合法的数字')
# print(goods_list[choice])
# # 商品
# print(goods_list[choice][0])
# # 价格
# print(goods_list[choice][1])
# 商品
goods_name=goods_list[choice][0]
# 价格
goods_price=goods_list[choice][1]
# 用户的余额大于商品的价格,才可购物
if user_dic['account']>=goods_price:
# 购买过这个商品进入if
if goods_name in shopping_cart:
# 第二次购买
shopping_cart[goods_name]['count']+=1
shopping_cart[goods_name]['price']=goods_price*shopping_cart[goods_name]['count']
# 第一次购买进入else
else:
shopping_cart[goods_name] = {'price':goods_price,'count':1}
# print(shopping_cart)
# 新的账户的金额 = 账户的金额 - 商品的价格
user_dic['account'] -= goods_price
# 花费的金额 = 花费的金额(一开始是0) + 商品的价格
cost_money+=goods_price
# 提示用户这一次你加入购物车的商品名字
print('%s新的商品'%goods_name)
else:
print('钱不够')
# 结账部分
elif choice == 't':
print('结账')
print(shopping_cart)
buy = input('买不买(y/n)>>>').strip()
if buy == 'y':
if cost_money == 0:
print('不买白看')
break
# 把购物车的信息存到用户信息里面去
user_dic['shopping_cart']= shopping_cart
print('%s 花费了%s 购买了%s'%(user_dic['name'],cost_money,shopping_cart))
print('账号信息%s' % user_dic)
break
else:
print('不买')
user_dic['account'] = 50000
break
else:
print('非法输入')
shopping()
1.4.登录装饰器
注意
(这个要写到shopping函数的前面,在shopping函数上方加上@login_intter)
# 登录装饰器
def login_intter(func):# func >>>> shopping
def wrapper():
login()
func()
return wrapper
2.三级菜单
需求:
打印省、市、县三级菜单
可返回上一级
可随时退出程序
menu = {
'北京':{
'海淀':{
'五道口':{
'网易':{},
'google':{}
},
'中关村':{
'爱奇艺':{},
'汽车之家':{},
'优酷':{},
},
'上地':{
'百度':{},
},
},
'昌平':{
'沙河':{
'北航':{},
},
'天通苑':{},
'回龙观':{},
},
'朝阳':{},
'东城':{},
},
'上海':{
'闵行':{
"人民广场":{
'炸鸡店':{}
}
},
'闸北':{
'火车战':{
'携程':{}
}
},
'浦东':{},
},
'湖南':{
'长沙':{
"世界之窗":{
'岳麓山':{}
}
},
'岳阳':{
'岳阳楼':{
}
},
'衡阳':{
},
},
}
1.简单方式
tag=True
while tag:
menu1=menu
for key in menu1: # 打印第一层
print(key)
choice1=input('第一层>>: ').strip() # 选择第一层
if choice1 == 'b': # 输入b,则返回上一级
break
if choice1 == 'q': # 输入q,则退出整体
tag=False
continue
if choice1 not in menu1: # 输入内容不在menu1内,则继续输入
continue
while tag:
menu_2=menu1[choice1] # 拿到choice1对应的一层字典
for key in menu_2:
print(key)
choice2 = input('第二层>>: ').strip()
if choice2 == 'b':
break
if choice2 == 'q':
tag = False
continue
if choice2 not in menu_2:
continue
while tag:
menu_3=menu_2[choice2]
for key in menu_3:
print(key)
choice3 = input('第三层>>: ').strip()
if choice3 == 'b':
break
if choice3 == 'q':
tag = False
continue
if choice3 not in menu_3:
continue
while tag:
menu_4=menu_3[choice3]
for key in menu_4:
print(key)
choice4 = input('第四层>>: ').strip()
if choice4 == 'b':
break
if choice4 == 'q':
tag = False
continue
if choice4 not in menu_4:
continue
# 第四层内没数据了,无需进入下一层
2.(初步实现):能够一层一层进入
layers = [menu, ]
while True:
current_layer = layers[-1]
for key in current_layer:
print(key)
choice = input('>>: ').strip()
if choice not in current_layer:
continue
# 把提取出来的第二层字典信息添加到列表layers里面
layers.append(current_layer[choice])
3.(改进):加上退出机制
layers=[menu,]
while True:
if len(layers) == 0:
break
current_layer=layers[-1]
for key in current_layer:
print(key)
choice=input('>>: ').strip()
if choice == 'b':
# 删除当前的那一层
layers.pop(-1)
continue
if choice == 'q':
break
if choice not in current_layer:
continue
layers.append(current_layer[choice])