• Python之作业购物车


                                           作业之购物车优化

    购物车优化要求如下:

    用户入口:

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

    商家入口:

    可以添加商品

    具体代码如下:

    import os, time#导入os和time模块
    if not os.path.exists('d:\consumer_login.txt'):#判断用户登录的文件是否存在
        with open('d:\users\consumer_login.txt','w') as f_cons:#创建文件
            f_cons.write('''{'zhangsan':'123','wangwu':'a324','lisi':'li123'}''')#写入数据
            f_cons.close()#关闭文件
    def login():#声明一个登录的函数
        '''该函数主要用于用户登录,错误三次的用户被锁定,且不能再登录,用户名和密码存在文件中,登录成功将打印欢迎语句。'''
        with open('d:\users\consumer_login.txt') as f_cons,
            open('d:\users\locked_users.txt','a+') as f_lock:#打开两个文件
            name_list = []#声明一个列表用于记录输入错误用户名的次数
            consumers = eval(f_cons.read())#把文件内的数据读取到内存
            f_lock.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
            lock_list = [i.strip() for i in f_lock.readlines()]#使用列表推导式把文件内的每行信息作为新列表的每个元素
            for i in lock_list:#遍历列表
                print('用户(33[31m%s33[0m)被锁定!'% i)
            while True:
                login_user = input('请输入用户名:').strip()
                if login_user in lock_list:#判断输入的用户是否已经存在于锁定文件当中
                    print('用户(33[31m%s33[0m)已被锁定!'% login_user)
                    break
                else:
                    login_pwd = input('请输入密码:').strip()
                    if (login_user,login_pwd) in consumers.items():#判断输入信息作为元祖的两个元素是否存在于字典的键值对中
                        print('欢迎来到购物商城!')
                        f_cons.close()
                        f_lock.close()
                        return login_user
                    else:
                        print('用户或者密码错误,请重新输入!')
                        name_list.append(login_user)#把输入错误的用户名添加到列表中
                        if name_list.count(login_user) == 3:#判断列表中本次输入的用户名是否出现三次
                            f_lock.write(login_user+'
    ')#把错误的用户名写入到文件中
                            print('用户(33[31m%s33[0m)已被锁定!'% login_user)
                            break
                        continue
    login_user = login()#赋值调用函数
    def first_login():#声明一个函数,判断用户是否是第一次登陆
        '''该函数用户判断用户是否是第一次登陆,如果是第一次登陆将输入金额并把金额存储到文件中,最终返回选择购物的函数'''
        with open('d:\users\users_list.txt','a+') as users_l,
            open('d:\users\%s_record.txt'% login_user,'a+') as record:
            users_l.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
            users_name = [i.strip() for i in list(users_l.readlines())]#利用列表推导式变量文件内容并赋值给列表
            if login_user in users_name:
                print('欢迎您再次光临购物商城!')
                record.close()
                users_l.close()
                return user_choice()#返回另一个函数
            else:
                users_l.write(login_user +'
    ')
                print('欢迎您第一次登录购物商城!')
                while True:
                    moneys = input('输入工资后才能开始购物,请输入您的金额:').strip()
                    if moneys.isdigit():
                        moneys = int(moneys)
                        print('您当前的金额为:33[31m%s33[0m元人民币!'% moneys)
                        record.write('用户名为33[34m%s33[0m的账号,第一次充值的金额为33[31m%s33[0m元人民
    币!	日期:33[34m%s33[0m
    '%(login_user,moneys,time.strftime('%Y-%m-%d %H:%M:%S')))
                        #上行代码中人民币中间有一个换号符
                        f = open('d:\users\%s_money.txt' % login_user,'a+')#创建一个用于存储用户金额的文件
                        f.write(str(moneys)+'
    ')
                        f.close()
                        users_l.close()
                        record.close()
                        return user_choice()
                    else:
                        print('输入的工资格式有误,请重新输入!')
                        continue
    if not os.path.exists('d:\users\goods.txt'):
        with  open('d:\users\goods.txt','w') as f_goods:
            f_goods.write('''{'book':13,'pig':300,'bike':'990','pen':5,'iphone':3000,'ipad':1800,}''')
            f_goods.close()
    def user_choice():#声明一个函数
        '''该函数主要用于用户选择购物和查询记录'''
        with open('d:\users\%s_record.txt'% login_user,'a+') as record,
            open('d:\users\%s_money.txt' % login_user,'a+')as f_money,
            open('d:\users\goods.txt') as f_goods:
            while True:
                print('温馨提示:
    A.按a或者A选择购物!
    B.按b或者B选择查询记录!
    C.按q或者Q退出程序!')
                choose = input('请输入您的选择:').strip()
                if choose == 'a' or choose == 'A':
                    good_dic = eval(f_goods.read())#把商品转换为内存里面的字典
                    while True:
                        for index,i in enumerate(good_dic,1):
                            print(index,'.33[34m%s33[0m 33[31m%s33[0m'%(i,good_dic[i]))
                        print('温馨提示:
    1.选择商品编号进行购买
    2.选择Q或者q退出商城')
                        choice = input('请选择您要购买的商品编号:').strip()
                        if choice.isdigit():
                            if int(choice) < len(good_dic.keys()):
                                gooded = list(good_dic.keys())[int(choice)-1]#获取编号对应的商品名称
                                f_money.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
                                moneys = int([i.strip() for i in list(f_money.readlines())][-1])#获取文件中的金额
                                if moneys >= int(good_dic[gooded]):
                                    moneys -= int(good_dic[gooded])
                                    record.write('您本次购买了价格为33[31m%s33[0m元的33[34m%s33[0m商品!当
    前总余额为33[31m%s33[0m元!'%(good_dic[gooded],gooded,moneys))
                                    record.write('	日期:33[34m%s33[0m
    '% time.strftime('%Y-%m-%d %H:%M:%S'))
                                    f_money.write(str(moneys)+'
    ')
                                    print('购买成功!')
                                    continue
                                else:
                                    print('余额不足!')
                                    continue
                            else:
                                print('out range!')
                                continue
                        elif choice == 'q' or choice == 'Q':
                            break
                        else:
                            print('Error!')
                            continue
                elif choose == 'b' or choose == 'B':
                    record.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
                    print(record.read())
                    continue
                elif choose == 'q' or choose == 'Q':
                    print('程序已退出!')
                    break
                else:
                    print('输入的格式有误!')
                    continue
    first_login()
    

    注:该代码实现的功能是:用户登录,错误三次将锁定用户,正确则需要判断是否是第一次登陆,第一次登陆需要输入金额和创建金额文件,然后选择购物或者查看购物记录,下次登陆则不需要输入金额,接着上次余额进行继续使用。

    购物车优化:

    import os, time#导入os和time模块
    if not os.path.exists('d:\consumer_login.txt'):#判断用户登录的文件是否存在
        with open('d:\users\consumer_login.txt','w') as f_cons:#创建文件
            f_cons.write('''{'zhangsan':'123','wangwu':'a324','lisi':'li123'}''')#写入数据
            f_cons.close()#关闭文件
    def login():#声明一个登录的函数
        '''该函数主要用于用户登录,错误三次的用户被锁定,且不能再登录,用户名和密码存在文件中,登录成功将打印欢迎语句。'''
        with open('d:\users\consumer_login.txt') as f_cons,
            open('d:\users\locked_users.txt','a+') as f_lock:#打开两个文件
            name_list = []#声明一个列表用于记录输入错误用户名的次数
            consumers = eval(f_cons.read())#把文件内的数据读取到内存
            f_lock.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
            lock_list = [i.strip() for i in f_lock.readlines()]#使用列表推导式把文件内的每行信息作为新列表的每个元素
            for i in lock_list:#遍历列表
                print('用户(33[31m%s33[0m)被锁定!'% i)
            while True:
                login_user = input('请输入用户名:').strip()
                if login_user in lock_list:#判断输入的用户是否已经存在于锁定文件当中
                    print('用户(33[31m%s33[0m)已被锁定!'% login_user)
                    break
                else:
                    login_pwd = input('请输入密码:').strip()
                    if (login_user,login_pwd) in consumers.items():#判断输入信息作为元祖的两个元素是否存在于字典的键值对中
                        print('欢迎来到购物商城!')
                        f_cons.close()
                        f_lock.close()
                        return login_user
                    else:
                        print('用户或者密码错误,请重新输入!')
                        name_list.append(login_user)#把输入错误的用户名添加到列表中
                        if name_list.count(login_user) == 3:#判断列表中本次输入的用户名是否出现三次
                            f_lock.write(login_user+'
    ')#把错误的用户名写入到文件中
                            print('用户(33[31m%s33[0m)已被锁定!'% login_user)
                            break
                        continue
    login_user = login()#赋值调用函数
    def first_login():#声明一个函数,判断用户是否是第一次登陆
        '''该函数用户判断用户是否是第一次登陆,如果是第一次登陆将输入金额并把金额存储到文件中,最终返回选择购物的函数'''
        with open('d:\users\users_list.txt','a+') as users_l,
            open('d:\users\%s_record.txt'% login_user,'a+') as record:
            users_l.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
            users_name = [i.strip() for i in list(users_l.readlines())]#利用列表推导式变量文件内容并赋值给列表
            if login_user in users_name:
                print('欢迎您再次光临购物商城!')
                record.close()
                users_l.close()
                return user_choice()#返回另一个函数
            else:
                users_l.write(login_user +'
    ')
                print('欢迎您第一次登录购物商城!')
                while True:
                    moneys = input('输入工资后才能开始购物,请输入您的金额:').strip()
                    if moneys.isdigit():
                        moneys = int(moneys)
                        print('您当前的金额为:33[31m%s33[0m元人民币!'% moneys)
                        record.write('用户名为33[34m%s33[0m的账号,第一次充值的金额为33[31m%s33[0m元人民
    币!	日期:33[34m%s33[0m
    '%(login_user,moneys,time.strftime('%Y-%m-%d %H:%M:%S')))
                        #上行代码中人民币中间有一个换号符
                        f = open('d:\users\%s_money.txt' % login_user,'a+')#创建一个用于存储用户金额的文件
                        f.write(str(moneys)+'
    ')
                        f.close()
                        users_l.close()
                        record.close()
                        return user_choice()
                    else:
                        print('输入的工资格式有误,请重新输入!')
                        continue
    if not os.path.exists('d:\users\goods.txt'):
        with  open('d:\users\goods.txt','w') as f_goods:
            f_goods.write('''{'book':13,'pig':300,'bike':'990','pen':5,'iphone':3000,'ipad':1800,}''')
            f_goods.close()
    def user_choice():#声明一个函数
        '''该函数主要用于用户选择购物和查询记录'''
        shopping_car = []
        with open('d:\users\%s_record.txt'% login_user,'a+') as record,
            open('d:\users\%s_money.txt' % login_user,'a+')as f_money:
            while True:
                print('温馨提示:
    A.按a或者A选择购物!
    B.按b或者B选择查询记录!
    C.按q或者Q退出程序!')
                choose = input('请输入您的选择:').strip()
                if choose == 'a' or choose == 'A':
                    f_goods = open('d:\users\goods.txt')
                    good_dic = eval(f_goods.read())#把商品转换为内存里面的字典
                    f_goods.close()
                    while True:
                        for index,i in enumerate(good_dic,1):
                            print(index,'.33[34m%s33[0m 33[31m%s33[0m'%(i,good_dic[i]))
                        print('温馨提示:
    1.选择商品编号进行购买
    2.选择Q或者q退出商城')
                        choice = input('请选择您要购买的商品编号:').strip()
                        if choice.isdigit():
                            if int(choice) <= len(good_dic.keys()):
                                gooded = list(good_dic.keys())[int(choice)-1]#获取编号对应的商品名称
                                f_money.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
                                moneys = int([i.strip() for i in list(f_money.readlines())][-1])#获取文件中的金额
                                if moneys >= int(good_dic[gooded]):
                                    moneys -= int(good_dic[gooded])
                                    buy = '您本次购买了价格为33[31m%s33[0m元的33[34m%s33[0m商品!当前总余
    额为33[31m%s33[0m元!'%(good_dic[gooded],gooded,moneys)
                                    shopping_car.append(buy)
                                    record.write(buy)
                                    record.write('	日期:33[34m%s33[0m
    '% time.strftime('%Y-%m-%d %H:%M:%S'))
                                    f_money.write(str(moneys)+'
    ')
                                    print('购买成功!商品33[34m%s33[0m已加入到购物车,您的余额为33[31m%s33[0m
    元!' % (gooded,moneys))
                                    continue
                                else:
                                    print('余额不足!')
                                    continue
                            else:
                                print('out range!')
                                continue
                        elif choice == 'q' or choice == 'Q':
                            break
                        else:
                            print('Error!')
                            continue
                elif choose == 'b' or choose == 'B':
                    record.seek(0)#(由于打开该文件的模式是a+所以需要跳转指针到开始位置)指定指针位置从0开始
                    print(record.read())
                    continue
                elif choose == 'q' or choose == 'Q':
                    if len(shopping_car) < 1:
                        print('您本次并未购买商品!')
                    else:
                        for i in shopping_car:
                            print(i)
                    print('程序已退出!')
                    break
                else:
                    print('输入的格式有误!')
                    continue
    first_login()
    

    注:主要优化点为:

    1. 购买成功时打印已购买商品和余额
    2. 退出时打印本次购买的商品和余额
    3. 优化购买商品与选择查询记录两个循环不能多次切换
    4. 声明:对于文件路径可以使用不指定路径,但上述代码未方便多次调试,加了指定路径
  • 相关阅读:
    angularJS的学习资源,巨全
    JSON语法
    handlerbars入门学习
    js中局部变量和全局变量的易混点
    js中判断一个变量是否为数字类型的疑问
    js中的类型转换方法
    使用sn.exe为程序集签名
    探究Entity Framework如何在多个仓储层实例之间工作单元的实现及原理(2018-05-31、2019-08-16修改部分严重错误代码)
    Fiddler4无法抓取HttpWebRequest本地请求的解决办法
    JS判断时特殊值与boolean类型的转换
  • 原文地址:https://www.cnblogs.com/single-boy/p/7530598.html
Copyright © 2020-2023  润新知