Python 模拟购物车的实例讲解


Posted in Python onSeptember 11, 2017

1.功能简介

此程序模拟用户登陆商城后购买商品操作。可实现用户登陆、商品购买、历史消费记查询、余额和消费信息更新等功能。首次登陆输入初始账户资金,后续登陆则从文件获取上次消费后的余额,每次购买商品后会扣除相应金额并更新余额信息,退出时也会将余额和消费记录更新到文件以备后续查询。

2.实现方法

架构:

本程序采用python语言编写,将各项任务进行分解并定义对应的函数来处理,从而使程序结构清晰明了。主要编写了六个函数:

(1)login(name,password)

用户登陆函数,实现用户名和密码验证,登陆成功则返回登陆次数。

(2)get_balance(name)

获取用户余额数据。

(3)update_balance(name,balance)

更新用户余额数据,当用户按q键退出时数据会更新到文件。

(4)inquire_cost_record(name)

查询用户历史消费记录。

(5)update_cost_record(name,shopping_list)

更新用户消费记录,当用户按q键退出时本次消费记录会更新到文件。

(6)shopping_chart()

主函数,完成人机交互,函数调用,各项功能的有序实现。

主要操作:

(1)根据提示按数字键选择相应选项进行操作。

(2)任意时刻按q键退出退出登陆,退出前会完成用户消费和余额信息更新。

使用文件:

(1)userlist.txt

存放用户账户信息文件,包括用户名、密码、登陆次数和余额。每次用户登陆成功会更新该用户登陆次数,每次按q键退出时会更新余额信息。

(2)***_cost_record.txt

存放某用户***消费记录的文件,用户首次购买商品后创建,没有购买过商品的用户不会产生该文件。每次按q键退出时会将最新的消费记录更新到文件。

3.流程图

Python 模拟购物车的实例讲解

4.代码

# Author:Byron Li
#-*-coding:utf-8-*-

'''----------------------------------------------使用文件说明----------------------------------------------------------
使用文件说明
userlist.txt     存放用户账户信息文件,包括用户名、密码、登陆次数和余额
***_cost_record.txt 存放某用户***消费记录的文件,用户首次购买商品后创建,没有购买过商品的用户不会产生该文件
---------------------------------------------------------------------------------------------------------------------'''
import os
import datetime

def login(name,password):  #用户登陆,用户名和密码验证,登陆成功则返回登陆次数
  with open('userlist.txt', 'r+',encoding='UTF-8') as f:
    line = f.readline()
    while(line):
      pos=f.tell()
      line=f.readline()
      if [name,password] == line.split()[0:2]:
        times=int(line.split()[2])
        line=line.replace(str(times).center(5,' '),str(times+1).center(5,' '))
        f.seek(pos)
        f.write(line)
        return times+1
  return None

def get_balance(name):  #获取用户余额数据
  with open('userlist.txt', 'r',encoding='UTF-8') as f:
    line = f.readline()
    for line in f:
      if name == line.split()[0]:
        return line.split()[3]
  print("用户%s不存在,无法获取其余额信息!"%name)
  return False

def update_balance(name,balance):  #更新用户余额数据
  with open('userlist.txt', 'r+',encoding='UTF-8') as f:
    line = f.readline()
    while(line):
      pos1=f.tell()
      line=f.readline()
      if name == line.split()[0]:
        pos1=pos1+line.find(line.split()[2].center(5,' '))+5
        pos2=f.tell()
        f.seek(pos1)
        f.write(str(balance).rjust(pos2-pos1-2,' '))
        return True
  print("用户%s不存在,无法更新其余额信息!" % name)
  return False

def inquire_cost_record(name):   #查询用户历史消费记录
  if os.path.isfile(''.join([name,'_cost_record.txt'])):
    with open(''.join([name,'_cost_record.txt']), 'r',encoding='UTF-8') as f:
      print("历史消费记录".center(40, '='))
      print(f.read())
      print("".center(46, '='))
      return True
  else:
    print("您还没有任何历史消费记录!")
    return False

def update_cost_record(name,shopping_list):  #更新用户消费记录
  if len(shopping_list)>0:
    if not os.path.isfile(''.join([name, '_cost_record.txt'])):   #第一次创建时第一行标上“商品 价格”
      with open(''.join([name, '_cost_record.txt']), 'a',encoding='UTF-8') as f:
        f.write("%-5s%+20s\n" % ('商品', '价格'))
        f.write(''.join([datetime.datetime.now().strftime('%c'), ' 消费记录']).center(40,'-'))  #写入消费时间信息方便后续查询
        f.write('\n')
        for product in shopping_list:
          f.write("%-5s%+20s\n"%(product[0],str(product[1])))
    else:
      with open(''.join([name, '_cost_record.txt']), 'a',encoding='UTF-8') as f:
        f.write(''.join([datetime.datetime.now().strftime('%c'), ' 消费记录']).center(40, '-'))
        f.write('\n')
        for product in shopping_list:
          f.write("%-5s%+20s\n"%(product[0],str(product[1])))
    return True
  else:
    print("您本次没有购买商品,不更新消费记录!")
    return False

def shopping_chart():  #主函数,用户交互,函数调用,结果输出
  product_list=[
    ('Iphone',5000),
    ('自行车',600),
    ('联想电脑',7800),
    ('衬衫',350),
    ('洗衣机',1000),
    ('矿泉水',3),
    ('手表',12000)
  ]  #商店商品列表
  shopping_list=[]  #用户本次购买商品列表
  while(True):
    username = input("请输入用户名:")
    password = input("请输入密码:")
    login_times=login(username,password)  #查询输入用户名和密码是否正确,正确则返回登陆次数
    if login_times:
      print('欢迎%s第%d次登陆!'.center(50,'*')%(username,login_times))
      if login_times==1:
        balance = input("请输入工资:")  #第一次登陆输入账户资金
        while(True):
          if balance.isdigit():
            balance=int(balance)
            break
          else:
            balance = input("输入工资有误,请重新输入:")
      else:
        balance=int(get_balance(username)) #非第一次登陆从文件获取账户余额
      while(True):
        print("请选择您要查询消费记录还是购买商品:")
        print("[0] 查询消费记录")
        print("[1] 购买商品")
        choice=input(">>>")
        if choice.isdigit():
          if int(choice)==0:         #查询历史消费记录
            inquire_cost_record(username)
          elif int(choice)==1:        #购买商品
            while (True):
              for index,item in enumerate(product_list):
                print(index,item)
              choice=input("请输入商品编号购买商品:")
              if choice.isdigit():
                if int(choice)>=0 and int(choice)<len(product_list):
                  if int(product_list[int(choice)][1])<balance:  #检查余额是否充足,充足则商品购买成功
                    shopping_list.append(product_list[int(choice)])
                    balance = balance - int(product_list[int(choice)][1])
                    print("\033[31;1m%s\033[0m已加入购物车中,您的当前余额是\033[31;1m%s元\033[0m" %(product_list[int(choice)][0],balance))
                  else:
                    print("\033[41;1m您的余额只剩%s元,无法购买%s!\033[0m" %(balance,product_list[int(choice)][0]))
                else:
                  print("输入编号错误,请重新输入!")
              elif choice=='q':   #退出账号登陆,退出前打印本次购买清单和余额信息,并更新到文件
                if len(shopping_list)>0:
                  print("本次购买商品清单".center(50,'-'))
                  for product in shopping_list:
                    print("%-5s%+20s"%(product[0],str(product[1])))
                  print("".center(50, '-'))
                  print("您的余额:\033[31;1m%s元\033[0m"%balance)
                  update_cost_record(username,shopping_list)
                  update_balance(username, balance)
                  print("退出登陆!".center(50, '*'))
                  exit()
                else:
                  print("您本次没有消费记录,欢迎下次购买!")
                  print("退出登陆!".center(50, '*'))
                  exit()
              else:
                print("选项输入错误,请重新输入!")
          else:
            print("选项输入错误,请重新输入!")
        elif choice=='q':  #退出账号登陆
          print("退出登陆!".center(50, '*'))
          exit()
        else:
          print("选项输入错误,请重新输入!")
      break
    else:
      print('用户名或密码错误,请重新输入!')

shopping_chart() #主程序运行

以上这篇Python 模拟购物车的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Protocol Buffers的C语言拓展提速Python程序的示例
Apr 16 Python
Python手机号码归属地查询代码
May 04 Python
用pandas按列合并两个文件的实例
Apr 12 Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
对Python subprocess.Popen子进程管道阻塞详解
Oct 29 Python
Python实现DDos攻击实例详解
Feb 02 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
Python线程障碍对象Barrier原理详解
Dec 02 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
Mar 24 Python
Python如何自动获取目标网站最新通知
Jun 18 Python
python实现猜数游戏(保存游戏记录)
Jun 22 Python
python添加模块搜索路径方法
Sep 11 #Python
解决Django模板无法使用perms变量问题的方法
Sep 10 #Python
python实现批量修改文件名代码
Sep 10 #Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 #Python
Python上下文管理器和with块详解
Sep 09 #Python
Python使用asyncio包处理并发详解
Sep 09 #Python
Python协程的用法和例子详解
Sep 09 #Python
You might like
一个php导出oracle库的php代码
2009/04/20 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
设定php简写功能的方法
2019/11/28 PHP
jQuery 动画基础教程
2008/12/25 Javascript
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
JavaScript事件 &quot;事件对象&quot;的注意要点
2016/01/14 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
北京某科技有限公司C# .net笔试题
2014/09/27 面试题
《李广射虎》教学反思
2014/04/27 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
人民币使用说明书
2019/04/17 职场文书
话题作文之学会尊重
2019/12/16 职场文书
mysql优化
2021/04/06 MySQL
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL