python学习--购物车4

模拟购物车的程序,是对之前学习的基础知识----字典、列表、文件的读写、字符的操作等知识的一次模拟练习,但在实际的编程中,将所有功能放在一个函数中实现,无疑减弱了程序的可读性和可维护性,购物车4引进了函数的概念,也将购物车需求经过整理如下:

要求

1、   登录功能

1>  登录验证:1、账户是否被锁定;2、验证用户为注册用户,登录密码是否正确,用户名与密码存放在文件中;

2>  验证失败三次,锁定账户,锁定账户在五分钟内不能再次登录,锁定账:

户存放在文件中。

2、   账户充值

1>  在购物时,出现余额不足是,可进行账户充值;

2>  可读取、保存账户余额。

3、   退出结算

1>  结束购物时,进行购物结算,打印消费信息与账户余额;

2>  购物结束时,保存购物商品信息;

3>  购物结束时,保存账户余额。

4、   购物

1>  打印操作说明;

2>  打印商品列表;

3>  商品分类;

4>  余额不足提示。

5>  购物操作,可根据不同购物类型,选择,显示该类型下商品列表,可选择返回上层目录。

实现代码如下:

def readDirInfo(filename):
    ‘读取字典列表,依据传递的文件名,获取不同的字典信息‘
    nameList = ‘‘
    with open(filename, ‘a+‘, encoding=‘utf8‘) as f:
        f.seek(0)
        nameList = str(f.readlines())

    nameList = nameList.strip(‘]‘).strip(‘[‘)
    nameList = nameList.strip(‘\"‘).strip(‘\"‘)

    if len(nameList) == 0:
        return {}

    return eval(nameList)    #字符转字典

def login(iTime = 3):
    ‘用户登录操作,包括以下功能:1、判断是否为注册账户;    2、登录账户是否被锁定(注:默认输错用户名密码三次后,锁定账号,五分钟内不能登录)‘
    i = 1
    flag = False

    lock_namelist = readDirInfo(‘locklist.txt‘)
    while i <= iTime:
        username = input("username:")
        password = input("password:")

        if loginLock(username,lock_namelist):
            print("you username is locked, try again after 5 min")
            break
        elif logincheck(username,password):
            print("welecom to shopping maket")
            flag = True
            break
        elif i == iTime:
            print("input more than three times, try again after 5 min")
            addLockDir(username, lock_namelist)
            break
        else:
            print("you put an wrong name or password,please input again")

        i += 1
    return flag,username

def loginLock(name, lock_namelist):
    ‘判断登录账号是否被锁定,如果被锁定时间超过5分钟,允许用户再次登录‘
    flag = False

    if name in lock_namelist:
        last_time = datetime.datetime.strptime(lock_namelist[name], "%Y-%m-%d %H:%M:%S")
        now_time = datetime.datetime.now()
        minute = (now_time - last_time)
        if int(minute.seconds/60) <= 5:
            flag = True

    return flag

def logincheck(name,password):
    ‘是否为注册账号‘
    flag = False
    name_dir = readDirInfo(‘name.txt‘)

    if name in name_dir:
        if password == name_dir[name]:
            flag = True

    return flag

def addLockDir(name,lock_namelist):
    ‘字典中添加元素,如果元素存在,修改元素的值‘
    if name in lock_namelist:
        lock_namelist[name] = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S")
    else:
        lock_namelist[name] = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S")

    with open(‘locklist.txt‘, ‘w‘, encoding="utf8") as f_read:
        f_read.write(str(lock_namelist))

def PrintOper():
    ‘打印操作说明‘
    prolist = ‘‘‘
    ***************   系统操作说明   ****************
       q : 退出系统
       c : 账号充值
       h : 购物记录
       l : 商品列表
    ************************************************
    ‘‘‘
    print(prolist)

def CreateDir():
    ‘判断文件夹是否存在,如果存在则退出,如果不存在,创建文件夹‘
    isExists = os.path.exists(‘History‘)

    if not isExists:
        os.mkdir(‘History‘)

    return isExists

def Exit():
    ‘退出购物系统,退出时进行购物结算‘
    Account()
    saveLevelMoney()
    exit()

def saveLevelMoney():
    with open(‘remain.txt‘,‘w‘,encoding=‘utf8‘) as f:
        f.write(str(remain_dir))

def Account():
    ‘购物计算,将购物信息写入购物历史文件中‘
    if len(shopping_cart) == 0:
        return False

    print("\033[34;1m---------------product list-----------------\033[0m \n \033[42;1m")
    temp = ‘id   product       number pric Totalpric‘
    print(temp)
    index = 1
    total_mon = 0

    f = open("product.txt", "a+", encoding="utf8")
    now_time = datetime.datetime.now().strftime(‘[%Y-%m-%d %H:%M:%S]‘)
    f.write(now_time + ‘\n‘ + temp + ‘\n‘)

    temp = ‘‘
    for i in shopping_cart.keys():
        total_mon += shopping_cart[i][1] * shopping_cart[i][0]
        temp = str("%d %10s %7d %7d %7d \n" % (index, i, shopping_cart[i][1], shopping_cart[i][0],
                                       shopping_cart[i][1] * shopping_cart[i][0]))

        print(temp)
        f.write(temp)
        index += 1

    f.close()

    print("you pay money is:%d \n you level money is: %d \n" % (total_mon, remain_dir[name]))
    print("\033[0m \n \033[34;1m-------------end-------------\033[0m")

def  Recharge():
    ‘账号充值操作‘
    while True:
        temp = input("Please rechange money:")

        if temp.isdigit():
            if name in remain_dir:
                remain_dir[name] += int(temp)
            else:
                remain_dir[name] = int(temp)
            break

        print("you input a unknow number,please check it and input again!")

def History():
    ‘打印历史购物记录‘
    filename = ‘History\\‘ + name + ‘.txt‘
    filename = filename.rstrip("\\")

    print(filename)
    if os.path.exists(filename):
        with open(filename,‘r‘,encoding=‘utf8‘) as f:
            for line in f:
                print(line.strip(‘\n‘))

    else:
        print(‘No you shoppong history‘)

def Operation():
    ‘用户交互操作‘
    while True:
        PrintOper()
        oper = str(input("Please input you choice:")).strip()

        if oper == ‘l‘:
            print(‘欢迎进入购物中心‘)
            shopping(product_list)
        elif oper in Oper_dir:
            Oper_dir[oper]()
        else:
            print("You input no in Oper list!")
            continue

def ProductList(print_list):
    ‘打印商品列表‘
    if isinstance(print_list, dict):  # 是否为列表
        for key in print_list:
            print(key)
    else:
        index = 0
        for product in print_list:
            print(index, product)
            index += 1

        print(‘b:‘,‘返回上级菜单‘)

    print(‘q:‘,‘退出购物中心‘)
    print(‘c‘,‘充值‘)

def shopping(product_list):
    ‘购物操作‘
    current_layer = product_list
    while True:
        ProductList(current_layer)
        choice = input(">>:").strip()
        if len(choice) == 0: continue

        if choice.isdigit():
            choice = int(choice)
            if choice >= 0 and choice < len(current_layer):
                product = current_layer[choice]
                if product[1] <= remain_dir[name]:
                    if product[0] in shopping_cart:
                        shopping_cart[product[0]][1] += 1
                    else:
                        shopping_cart[product[0]] = [product[1], 1]
                    remain_dir[name] -= product[1]
                    print("\033[42;1mAdded product: %s  into shoing cart ,you current balance %s \033[0m"
                          % (product[0], str(remain_dir[name])))
                else:
                    print("\033[42;1m [warning] you balance is no enough\033[0m, product:" + str(
                        product[1]) + " short for " + str(product[1] - remain_dir[name]))
            else:
                print("\033[41;1mYou choice product is no in product_list\033[0m")

        elif choice in current_layer:
            if isinstance(current_layer, dict):  # 是否为列表
                last_layer.append(current_layer)
                current_layer = current_layer[choice]
        elif choice == ‘q‘:
            break
        elif choice == ‘b‘:
            current_layer = BackUpLevel(current_layer)
        elif choice == ‘c‘:
            Recharge(name)

def BackUpLevel(current_layer):
    ‘返回到商品列表上一层‘
    if last_layer:
        current_layer = last_layer[-1]
        last_layer.pop()

    return  current_layer

import datetime
import os

product_list = {"生活用品":[[‘毛巾‘,20],
                [‘洗衣液‘,80],
                [‘衣架‘, 10],
                [‘洗衣粉‘,60],
                [‘洗发水‘, 80],
                [‘厕洗剂‘,50]],
                "家电":[[‘电视机‘,5000],
                      [‘电饭煲‘,300],
                      [‘电磁炉‘,200],
                      [‘高压锅‘,800],
                      [‘电饼铛‘,200]],
                }

shopping_cart = {}
Oper_dir = {‘q‘:Exit,‘c‘:Recharge,‘h‘:History}
last_layer = [ product_list ]
remain_dir = readDirInfo(‘remain.txt‘)
flag,name = login()

if flag:
    Operation()
时间: 2024-11-15 00:30:23

python学习--购物车4的相关文章

python学习--购物车2

将购物车程序分模块编程,购物车1写了登录 部分,下面改写购物部分: #!/usr/bin/env python product_list = [['Iphone7',5800], ['coffee',30], ['tea', 10], ['Python Book',99], ['Bike', 199], ['ViVo X9',2499]] shopping_cart = {} username = input("username:")print("**************

python学习-购物车小程序

购物车功能要求: 要求用户输入总资产,例如:2000显示商品列表,让用户根据序号选择商品,加入购物车购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功.附加:可充值.某商品移除购物车 1 goods = [ 2 {"name": "电脑", "price": 1999}, 3 {"name": "鼠标", "price": 10}, 4 {"name":

python学习--购物车1

购物车程序,程序要求如下: 1. 商品信息- 数量.单价.名称 2. 用户信息- 帐号.密码.余额 3. 用户可充值 4. 购物历史信息 5. 允许用户多次购买,每次可购买多件 6. 余额不足时进行提醒 7. 用户退出时 ,输出本次购物信息 8. 用户下次登陆时可查看购物历史 9. 商品列表分级 该程序涉及到的知识有:1.条件判断:2.循环应用:3.字典,以及列表的应用:4.文件的读写操作. 先写登录操作部分代码: #登录操作 username = input("username:")

python学习--购物车3

根据购物车题目的需求,本次分享的程序是将商品列表分级显示,例如:生活用品| |牙膏 |牙刷 |毛巾 家用电器| |电饭锅 即将列表存储商品信息,改成由字典来存放,程序如下: #初始化产品菜单 product_list = {"生活用品":[['毛巾',20], ['洗衣液',80], ['衣架', 10], ['洗衣粉',60], ['洗发水', 80], ['厕洗剂',50]], "家电":[['电视机',5000], ['电饭煲',300], ['电磁炉',20

python学习第二天

python学习的第二天就是个灾难啊,这天被打击了,自己写的作业被否认了,不说了,写博客还是个好习惯的,要坚持下去,就不知道能坚持到什么时候.呵呵!!! 这天教的知识和第一天的知识相差不大,区别在于比第一天讲的更细了(我们是两个老师教的,风格是不一样的),这次也写那些比较细的知识点. python的简介 (1)你的程序一定要有个主文件. (2)对于python,一切事物都是对象,对象基于类创建.#似懂非懂,不过有那么点似懂. 知识点 #__divmod__ 会把两个数字相除的商和余数以元组的方式

Python学习day5作业-ATM和购物商城

Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆,用户间转帐 支持多用户 管理员可添加账户.指定用户额度.冻结用户等 购物车: 商品信息- 数量.单价.名称 用户信息- 帐号.密码.余额 用户可充值 购物历史信息 允许用户多次购买,每次可购买多件 余额不足时进行提醒 用户退出时 ,输出当次购物信息 用户下次登陆时可查看购物历史 商品列表分级显示 1

python练习——购物车程序

思路: 1.首先生成一个用户字典文件,元素包含用户名,密码,余额,购物车清单.数量 2.导入字典内容,用于验证登录和记录用户信息 3.首页可以选择登录.注册和浏览商品列表 4.注册模块,要根据字典key值判断用户是否存在,存在就返回,不存在创建,密码字数限制没有做,getpass模块在window平台报错,没有写 5.登录模块,根据字典内容验证,验证成功登录,不成功询问是否注册,三次验证失败退出程序 6.登录成功后,判断用户字典中是否存在余额,不存在则要求用户输入金额,并保存在字典中 7.打印商

Python学习系列(四)Python 入门语法规则2

Python学习系列(四)Python 入门语法规则2 2017-4-3 09:18:04 编码和解码 Unicode.gbk,utf8之间的关系 2.对于py2.7, 如果utf8>gbk, utf8解码成Unicode,再将unicode编码成gbk 对于py3.5 如果utf8>gbk, utf8 直接编码成gbk(中间那一步直接被优化了) 3.很多时候,这个可以直接跳过,只有当编码出下问题的时候,再考虑这个知识点 二.运算符 1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算

python学习---购物商场与ATM

[软件说明& 注意事项] 1.购物商场&ATM程序开发环境: OS:64位Windows 7 IDE:pycharm4.0.4 python版本:3.5.1 32位 2.购物商场&ATM程序只做python学习使用,版权有作者所有,未经过作者本人同意,不得将此购物商场&ATM程序应用于商业用途. 目录结构如下: shopmall_atm |--shopmall | |--shopmall_handle.py | |--__init__.py |--atm | |--atm_