2.5. 实现一个简单的购物车代码

2.5.1. 1. 需求分析

功能要求:
要求用户输入总资产,例如:2000
显示商品列表,让用户根据序号选择商品,加入购物车
购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功。
附加:可充值、某商品移除购物车

2.5.2. 2. 代码示例

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

# 拥有的商品及价格
goods = [
    {"name": "电脑", "price": 1999},
    {"name": "鼠标", "price": 10},
    {"name": "游艇", "price": 20},
    {"name": "美女", "price": 998},
]

# 控制while循环开关
switch = "on"

# 购物车存放的商品及单价
gouwuche = {
    # 商品列表
    "wuping":[],
    # 单价列表
    "jiage":[]
}

# 用户输入会员卡内余额
while True:
    try:
        # 让用户输入会员卡内拥有的余额
        money = int(input("请输入你会员卡内的余额:"))
    # 异常判断,如果类型不是整型则执行except内的代码
    except ValueError:
        # 提示用户输入的格式错误,让其重新输入
        print("error,余额格式输入错误,请重新输入!\n例如:5000")
        # 终端当前循环让循环重新执行
        continue
    break

# 进入购买商品的流程
while switch == "on":

    # 打印出所有的商品
    print("\n","序列","商品","单价")
    # 以序列的方式输出现拥有的商品及商品单价
    for num,val in enumerate(goods,1):
        for n in range(len(goods)):
            if num-1 == n:
                print("  ",num,goods[n]["name"],goods[n]["price"])

    # 判断用户输入的序列是否规范
    while True:
        try:
            # 输入产品序列,类型转换为整型
            x = int(input("请选择商品序列:"))

        # 如果用户输入的非整型,提示用户重新输入
        except ValueError:
            print("error,请选择商品的序列")
            continue

        # 如果用户输入的序列不再产品序列当中让用户重新输入
        if x > num:
            print("error,请选择商品的序列")
            continue
        break

    # 输出购买物品的信息
    print("你已经把商品",goods[x-1]["name"],"加入购物车","物品单价是:",goods[x-1]["price"],"\n")
    # 把物品名称放入gouwuche的wuping列表中
    gouwuche["wuping"].append(goods[x-1]["name"])
    # 把物品单价放入gouwuche的jiage列表中
    gouwuche["jiage"].append(goods[x-1]["price"])

    # 用户输入选项
    while switch == "on":
        # 输出现有选项
        print("查看购物车:p 结算:w 删除商品:d 继续购买:n 充值:i 显示余额:m 退出:q")
        # 把用户输入的选项转换为字符串
        xx = str(input("请输入你的选择:"))

        # 如果用户输入的是p则列出当前购物车内的商品名称
        if xx == "p":
            # 以序列的方式输出字典gouwuche内的wuping列表
            for wp_num,val in enumerate(gouwuche["wuping"], 1):
                print(wp_num, val)

        # 如果用户输入的是w则结算
        elif xx == "w":
            # 定义一个默认的变量为用户商品的总金额
            zje = 0
            # 把gouwuche中的jiage列表内的整数进行相加并复制给zje
            for n in range(len(gouwuche["jiage"])):
                zje = zje + gouwuche["jiage"][n]
            # 如果商品的总金额大于用户会员卡内的余额,则提示用户钱不够
            if zje > money:
                print("sorry, 钱不够哦~~\n")
            # 否则就退出程序,并且输出用户本次消费的情况
            else:
                switch = "off"
                print("购物愉快,您本次消费",zje,"RMB","还剩余",money-zje,"RMB")

        # 如果用户输入的是d则进入删除购物车内的商品界面
        elif xx == "d":
            # 首先输出用户购物车内的商品列表
            for wp_num, val in enumerate(gouwuche["wuping"], 1):
                print(wp_num, val)
            # 选择所删除商品的序列
            while True:
                try:
                    deltet = int(input("请选择要删除的商品序列:"))
                except ValueError:
                    print("error,请输出正确的序列!")
                    continue
                if deltet > wp_num:
                    print("error,请选择商品的序列")
                    continue
                # 提示用户购物车内被删除的商品信息
                print("你已经删除产品", gouwuche["wuping"][deltet - 1], "单价为;", gouwuche["jiage"][deltet - 1])
                # 删除商品
                gouwuche["wuping"].pop(deltet - 1)
                # 删除金额
                gouwuche["jiage"].pop(deltet - 1)
                break

        # 如果用户输入的是i则进入用户会员卡充值页面
        elif xx == "i":
            # 判断用户输入的银行卡号格式是否正确
            while True:
                try:
                    user = int(input("请输入你的银行卡账号:"))
                except ValueError:
                    print("error,卡号格式输入错误,请重新输入..")
                    continue
                break

            # 判断用户输入的银行卡密码格式是否正确
            while True:
                try:
                    pwd = int(input("请输入银行卡的密码:"))
                except ValueError:
                    print("error,密码格式输入错误,请重新输入..")
                    continue
                break
            # 判断用户输入的账号和密码是否正确,默认的账号和密码都是123
            if user == 123 and pwd == 123:
                # 如果正确就让用户输入要充值的金额
                while True:
                    try:
                        newmoney = int(input("请输入充值的金额:"))
                    except ValueError:
                        print("error,金额格式输入错误,请重新输入..")
                        continue
                    break
                # 余额加上充值的金额
                money = money + newmoney
                # 输出本次充值的信息
                print("你已成功充值",newmoney,"RMB,现在账户余额为:",money,"RMB\n")
            # 如果用户银行卡账号或密码错误,就提示用户输入错误,让后让用户重新选择
            else:
                print("银行卡账号或密码错误.\n")

        # 如果用户输入的是m则显示用户会员卡内的余额
        elif xx == "m":
            print("账户余额:",money,"\n")

        # 如果用户输入的是q则退出程序
        elif xx == "q":
            # 把变量switch的值改为off
            switch = "off"

        # 如果用户输入的是n则继续购买商品
        elif xx == "n":
            break

        # 如果用户没有输入以上的任意一个选项则让用户重新输入
        else:
            print("请输出正确的选项!")