day09 Python写一个简单的购物车

一、简单购物车

基础要求: 1、启动程序后,输入用户名密码后,让用户输入工资,然后打印商品列表 2、允许用户根据商品编号购买商品 3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4、可随时退出,退出时,打印已购买商品和余额 5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示 扩展需求: 1、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买 2、允许查询之前的消费记录

二、实例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: fhb
# @Date  : 2018/10/27
# @Desc  :

from random import randint
import datetime, pickle, os

goods = [
    {"name": "电脑", "price": 1999},
    {"name": "鼠标", "price": 10},
    {"name": "游艇", "price": 20},
    {"name": "美女", "price": 998}
]

user_database = [
    {"username": "fhb", "password": "123"},
    {"username": "test", "password": "123"}
]



# 登陆次数限制
retry = 3

# 记录当前登陆成功的用户名
userinfo = ""

# 存放用户输入工资的状态,判断用户是否输入成功
salay_info = False

# 购物车
shop_list = []

# 存放用户余额、购买的商品、购买商品历史记录等信息
shop_list_record = {}

''' 用户购买记录信息要求如此方式存放 --> 数据结构
shop_list_record = {
            "username":{
                "balance":"0"
                "shop_record":[
                    "2018-10-27 10:00 购买了:电脑,消费:10000",
                    "2018-10-27 10:05 购买了:电脑,消费:10000",
                    "2018-10-27 10:10 购买了:电脑,消费:10000",
                ],
            },
            "username2":{
                "balance":"1000"
                "shop_record":[
                    "2018-10-27 11:00 购买了:电脑,消费:10000",
                    "2018-10-27 11:05 购买了:电脑,消费:10000",
                    "2018-10-27 11:10 购买了:电脑,消费:10000",
                ],
            }
        }
'''

# 初始化账户余额为 0
balance = 0

# 初始化购买商品历史记录为空
history_info = []

# 验证用户名和密码
user_auth_status = False
while not user_auth_status:

    username = input("请输入用户名: ").strip()
    password = input("请输入密码: ").strip()

    # 优先处理验证码
    verify_check_status = False
    while not verify_check_status:

        num = 0
        verify_code = ""
        while num < 4:
            verify_code += chr(randint(65, 90))
            num += 1

        verify_code_check = input("您的验证码是\033[1;31;40m{verify_code}\033[0m请输入验证码: ".format(verify_code=verify_code))

        if verify_code_check.upper() == verify_code:
            verify_check_status = True
        else:
            print("\033[1;31;40m验证码错误,请重新输入!\033[0m")

    # 验证码通过认证之后,验证用户名和密码,三次登陆失败之后,登陆受限!
    for user in user_database:
        username_check = user.get("username")

        # 此处先判断数据库中是否存在用户输入的用户和密码
        if username_check and username_check == username and user["password"] == password:
            user_auth_status = True
            userinfo = username
            print("登陆成功! 欢迎\033[1;31;40m{name}\033[0m".format(name=userinfo))
            break
    else:
        retry -= 1
        print("用户名和密码错误,请重新输入!,你还有 \033[1;31;40m{retry}\033[0m次登陆机会!".format(retry=retry))

    # 判断登陆次数,剩余次数为 retry
    if retry <= 0:
        print("\033[1;31;40m登陆受限,退出!\033[0m")
        break

# 用户登陆成功之后,才能查看商品列表以及后续操作
while user_auth_status:

    # 存放商品列表
    shop_list_dict = {}  # 要求存放这种形式的数据 {'1': {'name': '电脑', 'price': 1999}, '2': {'name': '鼠标', 'price': 10}...

    print("\n可选的商品列表:")

    for good in range(len(goods)):
        # 打印商品列表,并将编号和商品数据存放到一个新的字典shop_list_dict中,方便后面检索判断用户输入的内容是是否在商品列表中
        print("编号:%s, 名称:%s, 价格:¥%s" % (good + 1, goods[good]["name"],goods[good]["price"]))
        shop_list_dict.setdefault(str(good + 1), goods[good])

    # 读取历史记录
    if os.path.exists("shop_database.txt"):
        with open("shop_database.txt", 'rb') as f:
            history_record = pickle.load(f)
            shop_list_record = history_record

        record = history_record.get(userinfo)
        if record:
            result = record.get("balance")
            history_data = record.get("shop_record")

            if result:
                balance = result

            if history_data:
                history_info = history_data

    if balance <= 100:

        ack_status = False
        while not ack_status:
            chiose = input("当前可以消费的账户余额为:%s ,是否继续充值[y/n]: " % balance).strip()
            if chiose.lower() == "y":
                # 此处判断用户输入的工资是否是数字组成,如果不是强制重新输入
                while not salay_info:
                    salay_new = input("请输入工资: ").strip()
                    if salay_new.isdigit():
                        balance += int(salay_new)
                        salay_info = True
                        shop_list_record.setdefault(userinfo, {})["balance"] = balance
                        print("您当前的余额为: \033[1;31;40m{balance}\033[0m".format(balance=balance))
                        ack_status = True
                    else:
                        print("\033[1;31;40m工资输入有误,请重新输入!\033[0m")
            elif chiose.lower() == "n":
                ack_status = True
                continue
            else:
                print("\033[1;31;40m输入有误,请重新输入!\033[0m")

    # 等待用户选择商品
    shop_num = input("请输入商品编号,选择购买商品[q for quit, h for history]: ").strip()

    result = shop_list_dict.get(shop_num)

    # 打印历史记录
    if shop_num.upper() == "H":
        if history_info:
            n = 1
            for h in history_info:
                print("编号", n, h)
                n += 1
        else:
            print("历史记录为空!")
            continue

    # 退出的时候,打印购买的商品列表,如果没有购买任何商品,打印没有购买商品。
    elif shop_num.upper() == "Q":
        print("你购买的商品列表: ")
        if shop_list:
            sum = 1
            for l in shop_list:
                print("编号:%s, 名称:%s, 价格:%s" % (sum, l["name"], l["price"]))
                sum += 1
        else:
            print("你本次没有购买任何商品。")

        # 退出的时候也要更新数据中的余额和商品记录信息
        print("\033[1;31;40m当前账户余额: %s\033[0m" % balance)
        shop_list_record.setdefault(userinfo, {})["balance"] = balance

        with open("shop_database.txt", "wb") as f1:
            pickle.dump(shop_list_record, f1)

        exit(0)

    elif result:
        if result["price"] <= balance:
            balance -= result["price"]
            print("你选择的商品是: \033[1;31;40m%s\033[0m,当前余额: \033[1;31;40m%s\033[0m" % (result["name"], balance))
            shop_list.append(result)

            # 记录本次购买记录,方便用户后续查看
            time_stamp = datetime.datetime.now()
            shop_record = "时间:%s ,购买了:%s ,消费:%s;" % (time_stamp.strftime('%Y.%m.%d %H:%M:%S'), result["name"], result["price"])
            shop_list_record.setdefault(userinfo, {}).setdefault("shop_record", []).append(shop_record)
        else:
            print("余额不足,请重新充值!\033[1;36;40m%s\033[0m" % balance)

    else:
        print("\033[1;31;40m商品编号错误,请重新输入!\033[0m")

    # 每次消费,更新数据库中的余额 balance 中
    shop_list_record.setdefault(userinfo, {})["balance"] = balance

    # 将用户信息保存到文件中
    with open("shop_database.txt", "wb") as f:
        pickle.dump(shop_list_record, f)

  

转载于:https://www.cnblogs.com/fanghongbo/p/9870596.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,你需要了解几个概念: - 公历:我们平常使用的日历,也就是 Gregorian Calendar。 - 农历:中国传统使用的日历,又称阴历。农历比公历慢大约一个月,所以每年农历的月份都会比公历的月份多一个月。 - 闰年:公历中,能被 4 整除但不能被 100 整除的年份是闰年,或者能被 400 整除的年份也是闰年。闰年有 29 天的 2 月。 那么,我们可以先一个函数来判断一个年份是不是闰年: ```python def is_leap_year(year): if year % 4 == 0 and year % 100 != 0: return True if year % 400 == 0: return True return False ``` 然后,我们可以一个函数来计算公历中某个月的天数: ```python def days_in_month(year, month): if month in [1, 3, 5, 7, 8, 10, 12]: return 31 if month in [4, 6, 9, 11]: return 30 if month == 2: if is_leap_year(year): return 29 else: return 28 ``` 接下来,我们可以一个函数来计算公历中某年的天数: ```python def days_in_year(year): if is_leap_year(year): return 366 return 365 ``` 最后,我们可以一个函数来输出公历中某年某月的日历: ```python def print_calendar(year, month): # 输出日历的头部 print("Sun Mon Tue Wed Thu Fri Sat") # 计算当月 1 号是星期几 start_day = 1 # 假设 1 ### 回答2: 万年历是指能够显示计算机时代至远古时代任意年份、月份的月历,包括每个月的日期排列、星期几等信息。下面是使用Python来编一个简单的万年历的示例代码: ```python import calendar def print_calendar(year, month): c = calendar.TextCalendar(calendar.SUNDAY) calendar_str = c.formatmonth(year, month) print(calendar_str) def main(): year = int(input("请输入年份:")) month = int(input("请输入月份:")) print("----- %d年%d月 -----" % (year, month)) print_calendar(year, month) if __name__ == "__main__": main() ``` 这段代码使用了`calendar`模块来生成日历信息,首先通过`input`函数获取用户输入的年份和月份。然后通过`TextCalendar`类来生成指定年份和月份的日历信息。最后通过`print`函数将日历信息打印出来。 用户将会被要求输入一个年份和一个月份,程序将会生成并显示出相应的月历信息。 这是一个简单的示例,你也可以根据自己的需求加入更多的功能,比如支持一次性打印多个月份的日历,或者添加查找特定日期的功能等等。 ### 回答3: 万年历是一个可以显示公历日期的日历,包括年、月和日。使用Python万年历可以通过日期计算和条件判断来实现。 下面是一个简单Python代码示例实现一个万年历: ```python import calendar def get_calendar(year): # 使用calendar库中的TextCalendar类来获取指定年份的日历 cal = calendar.TextCalendar() # 使用formatyear方法获取整个年份的日历,并返回字符串 return cal.formatyear(year) def main(): while True: try: year = int(input("请输入要查看的年份:")) if year <= 0: raise ValueError break except ValueError: print("输入错误,请输入一个大于0的整数年份!") # 调用get_calendar函数获取日历字符串 calendar_str = get_calendar(year) # 打印日历 print(calendar_str) if __name__ == "__main__": main() ``` 运行这段代码,就可以输入一个年份,然后输出该年份的日历。 代码首先导入了`calendar`库,然后定义了一个`get_calendar`函数,该函数接受一个年份作为参数,使用`TextCalendar`类获取指定年份的日历,然后调用`formatyear`方法返回日历的字符串表示。 `main`函数中使用一个循环不断读取用户输入的年份(必须是大于0的整数),然后调用`get_calendar`函数获取指定年份的日历字符串,并打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值