• python第八天)——购物车作业优化完成


    发现之前的三级菜单代码有BUG现已经修改过来了

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

    对于昨天的作业自己不太满意!所以重新设计了流程图:

    增加新的功能:

    1,可以注册!

    2,可以查看当前购物的清单

    3,可以不结算退出

    详细代码如下:

      1 #!usr/bin/env python
      2 #-*-coding:utf-8-*-
      3 # Author calmyan
      4 import time,sys,os
      5 user_file=open("user_file.txt",'r+',encoding='utf-8')#打开用户列表文件
      6 #with open('user_file.txt','r+',encoding='utf-8') as user_file:
      7 user_list=eval(user_file.readline())#转换用户文件中的字符串  user_list:注册用户列表
      8 lock_name=open('lock_name.txt','r+',encoding='utf-8')#打开锁定用户列表文件
      9 lock_list=eval(lock_name.readline())#转换锁定用户文件中的字符串
     10 
     11 
     12 def regis():
     13     while True:
     14         name=input("请输入您要注册的用户名:")
     15         if name not in user_list:
     16             print("恭喜!该用户名可以被注册!>>>")
     17             password=input('请输入密码:')
     18             password2=input('请再次确认密码:')
     19             if password==password2:
     20                 name_infor='''恭喜您用户注册成功!
     21                     用户名:{name}
     22                     密  码:{password}
     23                     请牢记您的用户名与密码
     24                 '''
     25                 print(name_infor.format(name=name,password=password2))
     26                 user_list[name]=password2#增加注册用户到字典中
     27                 user_file.seek(0)#称到最前
     28                 user_file.write(str(user_list))#写入文件
     29                 user_file.flush()#即可保存
     30 
     31                 #confirm()
     32                 break
     33         else:
     34             print("该用户名已经被注册啦!请重新来过<<<")
     35             confirm()#是否退出
     36             continue
     37 
     38 
     39 
     40 def userchar(_user_name):#检测用户名的函数
     41     while True:
     42         if _user_name in user_list and _user_name not in lock_list:#判断用户是否存在并正常
     43             return True#存在返回真
     44         elif _user_name in user_list and _user_name  in lock_list:#判断用户是否被锁定
     45             print('您的用户已经被锁定,请联系商家解锁!')
     46             break
     47         else:
     48             reg=input('您输入用户不存在,请先注册!按33[31;1m Q/q33[0m 直接退出  33[31;1m Y/y33[0m 确定注册,其它键返回!')
     49             if reg=='y' or reg=='Y':
     50                 regis()#用户注册函数
     51                 print('是否直接退出商城?')
     52                 break
     53             elif  reg=='q' or reg=='Q':
     54                 print("您已经退出!" )
     55                 exit()
     56             else :
     57                 break
     58 
     59 def confirm():#退出确认函数
     60     qu=input("是否退出!按33[31;1mY/y33[0m退出? 按其它键返回<<<")
     61     if qu=='Y'or qu=='y':
     62         print("您已经退出!" )
     63         exit()#退出程序
     64     else :
     65         pass
     66 
     67 def user_pass():
     68     bool=True#定义退出循环条件变量
     69     while bool:
     70         print("用户登陆".center(30,'-'))
     71         _user_name=(input('请输入用户名:'))
     72         if userchar(_user_name.strip()):#运行检测用户名的函数判断,去除两边空格
     73             count=3#定义锁次数
     74             while count>0 :#如果密码错误次数超过退出密码输入
     75                 #password=getpass.getpass('请输入密码:')
     76                 password=input('请输入密码:')
     77                 if password==user_list[_user_name]:#密码通过验证结束循环
     78                     print("密码通过验证")
     79                     bool=False
     80                     print("欢迎您  33[32;1m%s33[0m  您已经登陆成功!" % _user_name)
     81                     return _user_name#返回用户名
     82                 else:
     83                     count -=1#次数减少
     84                     print("密码错误请重试,剩余:33[31;1m%s33[0m次! "% count)
     85                     pass
     86             else:
     87                 print("33[31;1m超出所试次数,账户已锁定!请联系商家!33[0m")
     88                 lock_list.append(_user_name)#将用户名加出锁定列表
     89                 lock_name.seek(0)#指针移动到开头,以免产生多个元组
     90                 lock_name.write(str(lock_list))#写入锁定用户文件
     91                 lock_name.tell()#获取当前指针,以免产生多个元组
     92                 lock_name.close()#关闭锁定用户文件
     93                 confirm()#退出确认函数
     94                 #continue#退回到输入用户名的位置
     95         else:#如果用户名出错新来过
     96             confirm()
     97             pass
     98 
     99 def infor():#打开用户信息函数
    100     with open('user_infor','r+',encoding='utf-8') as user_infor:#打开用户购物信息文件
    101         infor_list=eval(user_infor.readline())#转换文件的字符串
    102     return infor_list
    103 
    104 def history_user():#用户购物历史记录函数
    105     with open('history','r',encoding="utf-8") as user_history:#读取用户文件
    106         history_list=eval(user_history.readline())#用户购物信息
    107     return history_list
    108 
    109 def history():#用户消费记录函数
    110     history_list=history_user()#用户购物历史记录
    111     history=history_list[_user_name]#用户购物记录信息
    112     print('您的购物记录如下:')
    113     for k,v in history.items():#转为列表进行输出
    114         print(k,v)#输出购物记录
    115     choose_index=input("请选择您想要的操作:按33[32;1mq/Q33[0m直接退出商城!其它键返回!")
    116     if choose_index=='Q' or choose_index=='q' :
    117         choo=input('''>>>>>33[42;1m您确定出退商城吗?33[0m
    118                     如果您已经添加商品,此操作将不进行结算,
    119                     您就无法将心爱的东东买回家了,按33[31;1my/Y33[0m确定直接退出!''')
    120         if choo=='y'or choo=='Y':
    121             print("您已经出退商城!")
    122             exit()
    123     else:
    124         pass
    125 #程序开始:
    126 if os.path.exists('history'):#确认文件是否存在
    127     pass
    128 else:
    129     with open('history','w',encoding='utf-8') as user_history:#创建一个用户帐户购物记录文件
    130         user_history.write('{}')#写入空值
    131     pass
    132 
    133 if os.path.exists('user_infor'):#确认文件是否存在
    134     pass
    135 else:
    136     with open('user_infor','w',encoding='utf-8') as user_infor:#创建一个用户帐户信息记录文件
    137         user_infor.write('{}')#写入空值
    138     pass
    139 
    140 print("欢迎来到33[31;1mpython33[0m购物商城!")
    141 
    142 time_format='%y-%m-%d %X'#定义时间格式
    143 times=time.strftime(time_format)#定义时间
    144 _user_name= user_pass()#将通过验证的用户名赋于变量
    145 
    146 if _user_name in infor():#如果用户信息存在记录就跳过
    147     pass
    148 else:
    149     while True:
    150         name_char=input("首次登陆,请输入工资(购物资金):")#用户输入工资(购物资金)
    151         if  name_char.isdigit():#检测输入是否为整数
    152             name_char=int(name_char)#转为int
    153             with open('history','r+',encoding='utf-8') as user_history:#打开用户帐户购物记录文件
    154                 history_list=eval(user_history.readline())#将文本读为字典
    155                 history_list[_user_name]={}#创建用户购物记录
    156                 user_history.seek(0)#移到开头
    157                 user_history.write(str(history_list))#写入文件
    158             with open('user_infor','r+',encoding='utf-8') as user_infor:
    159                 infor_list=eval(user_infor.readline())#转换首登用户文件中的字符串
    160                 infor_list[_user_name]={"金额":name_char}
    161                 user_infor.seek(0)
    162                 user_infor.write(str(infor_list))#写入用户信息
    163             print("充值成功,充值金额:33[32;1m%s33[0m元."% name_char)
    164             break
    165         else:
    166             print('金额不能为0或负数请正确输入金额!')
    167             continue
    168 
    169 #再次登陆直接显示用户信息
    170 infor_list=infor()#使用用户信息函数 获取用户信息字典
    171 name_char=int(infor_list[_user_name]['金额'])#获取余额
    172 print("
    您的帐户信息:")
    173 print('用户名:33[32;1m%s33[0m:'%_user_name)#输出用户信息
    174 print('您的余额:33[31;1m%s33[0m元.:'%name_char)
    175 while True:
    176     print('''您可以进行以下相关操作:
    
    177             按 1 >>>查询购物记录。
    178             按 2 >>>显示商品列表开始购物!
    179             按 3 >>>直接出退商城!
    180     ''')
    181     choose=input("请选择您所要的功能:")#请用户可以查询
    182     if choose=='1':
    183         history()#查询消费记录
    184     elif choose=='2':
    185         ###进入商品列表###
    186         shoplist=[]#购物车列表
    187         shop_count=0#购物金额统计
    188         goodsname=[]#定义商品列表
    189         print('加载商品列表:')
    190         for i in range(40):#加载动画
    191             sys.stdout.write('#')
    192             sys.stdout.flush()
    193             time.sleep(0.05)
    194         print('
    ')
    195         with open('goodslist.txt','r',encoding='utf-8') as f:#打开商品列表文件
    196             for line in f:
    197                 a=line.find(',')#定位分割符的索引进行分割
    198                 goodsname.append((line[0:a],int(line[a+1:])))#元组模式追加到列表,价格转为整数
    199         while True:
    200             print("商品列表".center(50,'='))
    201             for index,p_item in enumerate(goodsname):#取出下标输出 商品列表
    202                 print(index,p_item)#输出商品列表
    203             print("列表底部".center(50,'='))
    204             user_index=input('请输入商品编号添加你所在购买的商品,按33[31;1mc/C33[0m>> 查看当前购物清单, 33[31;1mh/H33[0m查看消费记录 33[31;1mq/Q33[0m结算商品退出>>>:')
    205             if user_index.isdigit():#判断是否为整数
    206                 user_index=int(user_index)#转为数字
    207                 if user_index < len(goodsname) and user_index>=0:#判断所选商品编号在在列表
    208                     p_item=goodsname[user_index]#读取下标所在(元素)商品
    209                     if p_item[1]<=name_char:#余额是否足够
    210                         shoplist.append(p_item)#添加到购物车
    211                         name_char-=p_item[1]#扣除金额
    212                         shop_count+=p_item[1]#累加购物金额
    213                         print("添加 33[32;1m%s33[0m 到购物车,价格: 33[32;1m%s33[0m 元"% p_item)
    214                         print("你的购物金额余: 33[31;1m%s33[0m 元"% name_char)
    215                     else:
    216                         print("你的购物金额余: 33[41;1m%s33[0m 元,无法购买该商品!" % name_char)
    217                 else:
    218                      print('输入错误,该编号 33[41;1m%s33[0m 的商品不存在!'%user_index)
    219             elif user_index=='q'or user_index=='Q':
    220                 print('你的购物清单:')
    221                 for up in shoplist:#打印购物清单
    222                     print(up)
    223                 print("你的购物总金额为:33[32;1m%s33[0m 元!"% shop_count)
    224                 print("你的购物金额余: 33[31;1m%s33[0m 元!" % name_char)
    225                 while True:
    226                     confirm=input("你是否确定结算商品并退出商城?33[31;1m Y/y33[0m是, 33[31;1mN/n33[0m否:")
    227                     if confirm== 'Y'or confirm== 'y' :
    228                         infor_list[_user_name]['金额']=name_char#修改用户金额(购物后)
    229                         shoplist.append(('总额:',shop_count))#列表加入总额
    230                         history_list=history_user()#用户消费记录函数
    231                         history_list[_user_name][times+'购物清单:']=shoplist#添加时间:清单
    232                         with open('user_infor','w',encoding="utf-8") as user_infor:#写入文件用户信息
    233                             user_infor.seek(0)#移到最前
    234                             user_infor.write(str(infor_list))#写入
    235                         with open('history','r+',encoding='utf-8') as user_history:#购物信息写入文件
    236                             user_history.seek(0)#移到最前
    237                             user_history.write(str(history_list))#写入
    238                         exit(print("谢谢!33[31;1mpython33[0m 商城欢迎您再次光临!"))
    239                     elif confirm=='N'or confirm== 'n' :
    240                         break
    241                     else:
    242                         print("输入错误!请按提示输入!")
    243                         continue
    244             elif user_index=='h'or user_index=='H':
    245                 history()#查消费记录
    246             elif user_index=='c'or user_index=='C':
    247                 print("当前购物清单:")
    248                 for up in shoplist:#打印购物清单
    249                     print(up)
    250                 print("总金额:33[32;1m%s33[0m"%shop_count)
    251                 continue
    252             else:
    253                 print('33[41;1m输入商品编号错误,请重新输入!33[0m')
    254 
    255     elif choose=='3':
    256         print("您已经出退商城!")
    257         exit()#退出商城
    258     else:
    259         print("33[31;1m输入有误,请重新输入!33[0m")
    260         continue

    花了两天,感觉还是值得的!!哈哈!

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【莫柔落切】!

    联系或打赏博主【莫柔落切】!https://home.cnblogs.com/u/uge3/

  • 相关阅读:
    爬虫1 爬虫介绍, requests模块, 代理(正向代理,反向代理), 爬梨视频, 自动登录网站, HTTP协议复习, 伪静态概念, 301和302状态码区别, http版本0.9 1.1 和2.0的区别
    数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树
    算法 时间复杂度, 空间复杂度, 冒泡排序**, 选择排序, 插入算法, 快速排序**, 希尔算法,计数排序, 二分法查找**
    量化分析 在线量化分析网站
    数据分析3 matplotlib绘图, 折线图(刻度与范围,标题,注释), 曲线图例, 过滤报警信息, 柱状图, 曲线图, 饼图
    [编织消息框架][netty源码分析]6 ChannelPipeline 实现类DefaultChannelPipeline职责与实现
    [编织消息框架][netty源码分析]5 EventLoopGroup 实现类NioEventLoopGroup职责与实现
    [编织消息框架][netty源码分析]4 EventLoop 实现类NioEventLoop职责与实现
    编程之路
    [编织消息框架][netty源码分析]3 EventLoop 实现类SingleThreadEventLoop职责与实现
  • 原文地址:https://www.cnblogs.com/uge3/p/6835697.html
Copyright © 2020-2023  润新知