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 相关文章推荐
跟老齐学Python之有容乃大的list(4)
Sep 28 Python
Python实现线程池代码分享
Jun 21 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
python中setuptools的作用是什么
Jun 19 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 Python
如何利用python发送邮件
Sep 26 Python
python如何实现word批量转HTML
Sep 30 Python
Python 多进程、多线程效率对比
Nov 19 Python
pytorch中index_select()的用法详解
Jan 06 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 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
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
javascript实现数独解法
2015/03/14 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
详解Vue源码中一些util函数
2019/04/24 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
python如何删除列为空的行
2020/07/17 Python
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
项目经理岗位职责
2013/11/11 职场文书
大学毕业感言100字
2014/02/03 职场文书
超市创意活动方案
2014/08/15 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
天鹅湖观后感
2015/06/09 职场文书
鸦片战争观后感
2015/06/09 职场文书
大学副班长竞选稿
2015/11/21 职场文书