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每次处理固定个数的字符的方法总结
Jan 29 Python
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 Python
Django 实现购物车功能的示例代码
Oct 08 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
May 15 Python
Django配置文件代码说明
Dec 04 Python
python 字典访问的三种方法小结
Dec 05 Python
如何利用python读取micaps文件详解
Oct 18 Python
Python性能测试工具Locust安装及使用
Dec 01 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
Dec 27 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 Python
Python各协议下socket黏包问题原理
Apr 12 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php验证码生成代码
2015/11/11 PHP
php读取本地json文件的实例
2018/03/07 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
JS Timing
2007/04/21 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
在漏洞利用Python代码真的很爽
2007/08/26 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
DNA基因检测和分析:23andMe
2019/05/01 全球购物
陈胜吴广起义口号
2014/06/20 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
男方婚礼答谢词
2015/01/20 职场文书
情人节活动总结范文
2015/02/05 职场文书
政审证明范文
2015/06/19 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
Nginx实现负载均衡的项目实践
2022/03/18 Servers