Python程序练习3--模拟购物车

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.流程图

4.代码

  1 # Author:Byron Li
  2 #-*-coding:utf-8-*-
  3
  4 ‘‘‘----------------------------------------------使用文件说明----------------------------------------------------------
  5 使用文件说明
  6 userlist.txt         存放用户账户信息文件,包括用户名、密码、登陆次数和余额
  7 ***_cost_record.txt  存放某用户***消费记录的文件,用户首次购买商品后创建,没有购买过商品的用户不会产生该文件
  8 ---------------------------------------------------------------------------------------------------------------------‘‘‘
  9 import os
 10 import datetime
 11
 12 def login(name,password):   #用户登陆,用户名和密码验证,登陆成功则返回登陆次数
 13     with open(‘userlist.txt‘, ‘r+‘,encoding=‘UTF-8‘) as f:
 14         line = f.readline()
 15         while(line):
 16             pos=f.tell()
 17             line=f.readline()
 18             if [name,password] == line.split()[0:2]:
 19                 times=int(line.split()[2])
 20                 line=line.replace(str(times).center(5,‘ ‘),str(times+1).center(5,‘ ‘))
 21                 f.seek(pos)
 22                 f.write(line)
 23                 return times+1
 24     return None
 25
 26 def get_balance(name):   #获取用户余额数据
 27     with open(‘userlist.txt‘, ‘r‘,encoding=‘UTF-8‘) as f:
 28         line = f.readline()
 29         for line in f:
 30             if name == line.split()[0]:
 31                 return line.split()[3]
 32     print("用户%s不存在,无法获取其余额信息!"%name)
 33     return False
 34
 35 def update_balance(name,balance):    #更新用户余额数据
 36     with open(‘userlist.txt‘, ‘r+‘,encoding=‘UTF-8‘) as f:
 37         line = f.readline()
 38         while(line):
 39             pos1=f.tell()
 40             line=f.readline()
 41             if name == line.split()[0]:
 42                 pos1=pos1+line.find(line.split()[2].center(5,‘ ‘))+5
 43                 pos2=f.tell()
 44                 f.seek(pos1)
 45                 f.write(str(balance).rjust(pos2-pos1-2,‘ ‘))
 46                 return True
 47     print("用户%s不存在,无法更新其余额信息!" % name)
 48     return False
 49
 50 def inquire_cost_record(name):     #查询用户历史消费记录
 51     if os.path.isfile(‘‘.join([name,‘_cost_record.txt‘])):
 52         with open(‘‘.join([name,‘_cost_record.txt‘]), ‘r‘,encoding=‘UTF-8‘) as f:
 53             print("历史消费记录".center(40, ‘=‘))
 54             print(f.read())
 55             print("".center(46, ‘=‘))
 56             return True
 57     else:
 58         print("您还没有任何历史消费记录!")
 59         return False
 60
 61 def update_cost_record(name,shopping_list):   #更新用户消费记录
 62     if len(shopping_list)>0:
 63         if not os.path.isfile(‘‘.join([name, ‘_cost_record.txt‘])):     #第一次创建时第一行标上“商品  价格”
 64             with open(‘‘.join([name, ‘_cost_record.txt‘]), ‘a‘,encoding=‘UTF-8‘) as f:
 65                 f.write("%-5s%+20s\n" % (‘商品‘, ‘价格‘))
 66                 f.write(‘‘.join([datetime.datetime.now().strftime(‘%c‘), ‘ 消费记录‘]).center(40,‘-‘))   #写入消费时间信息方便后续查询
 67                 f.write(‘\n‘)
 68                 for product in shopping_list:
 69                     f.write("%-5s%+20s\n"%(product[0],str(product[1])))
 70         else:
 71             with open(‘‘.join([name, ‘_cost_record.txt‘]), ‘a‘,encoding=‘UTF-8‘) as f:
 72                 f.write(‘‘.join([datetime.datetime.now().strftime(‘%c‘), ‘ 消费记录‘]).center(40, ‘-‘))
 73                 f.write(‘\n‘)
 74                 for product in shopping_list:
 75                     f.write("%-5s%+20s\n"%(product[0],str(product[1])))
 76         return True
 77     else:
 78         print("您本次没有购买商品,不更新消费记录!")
 79         return False
 80
 81 def shopping_chart():    #主函数,用户交互,函数调用,结果输出
 82     product_list=[
 83         (‘Iphone‘,5000),
 84         (‘自行车‘,600),
 85         (‘联想电脑‘,7800),
 86         (‘衬衫‘,350),
 87         (‘洗衣机‘,1000),
 88         (‘矿泉水‘,3),
 89         (‘手表‘,12000)
 90     ]   #商店商品列表
 91     shopping_list=[]   #用户本次购买商品列表
 92     while(True):
 93         username = input("请输入用户名:")
 94         password = input("请输入密码:")
 95         login_times=login(username,password)   #查询输入用户名和密码是否正确,正确则返回登陆次数
 96         if login_times:
 97             print(‘欢迎%s第%d次登陆!‘.center(50,‘*‘)%(username,login_times))
 98             if login_times==1:
 99                 balance = input("请输入工资:")   #第一次登陆输入账户资金
100                 while(True):
101                     if balance.isdigit():
102                         balance=int(balance)
103                         break
104                     else:
105                         balance = input("输入工资有误,请重新输入:")
106             else:
107                 balance=int(get_balance(username))  #非第一次登陆从文件获取账户余额
108             while(True):
109                 print("请选择您要查询消费记录还是购买商品:")
110                 print("[0] 查询消费记录")
111                 print("[1] 购买商品")
112                 choice=input(">>>")
113                 if choice.isdigit():
114                     if int(choice)==0:                 #查询历史消费记录
115                         inquire_cost_record(username)
116                     elif int(choice)==1:               #购买商品
117                         while (True):
118                             for index,item in enumerate(product_list):
119                                 print(index,item)
120                             choice=input("请输入商品编号购买商品:")
121                             if choice.isdigit():
122                                 if int(choice)>=0 and int(choice)<len(product_list):
123                                     if int(product_list[int(choice)][1])<balance:   #检查余额是否充足,充足则商品购买成功
124                                         shopping_list.append(product_list[int(choice)])
125                                         balance = balance - int(product_list[int(choice)][1])
126                                         print("\033[31;1m%s\033[0m已加入购物车中,您的当前余额是\033[31;1m%s元\033[0m" %(product_list[int(choice)][0],balance))
127                                     else:
128                                         print("\033[41;1m您的余额只剩%s元,无法购买%s!\033[0m" %(balance,product_list[int(choice)][0]))
129                                 else:
130                                     print("输入编号错误,请重新输入!")
131                             elif choice==‘q‘:      #退出账号登陆,退出前打印本次购买清单和余额信息,并更新到文件
132                                 if len(shopping_list)>0:
133                                     print("本次购买商品清单".center(50,‘-‘))
134                                     for product in shopping_list:
135                                         print("%-5s%+20s"%(product[0],str(product[1])))
136                                     print("".center(50, ‘-‘))
137                                     print("您的余额:\033[31;1m%s元\033[0m"%balance)
138                                     update_cost_record(username,shopping_list)
139                                     update_balance(username, balance)
140                                     print("退出登陆!".center(50, ‘*‘))
141                                     exit()
142                                 else:
143                                     print("您本次没有消费记录,欢迎下次购买!")
144                                     print("退出登陆!".center(50, ‘*‘))
145                                     exit()
146                             else:
147                                 print("选项输入错误,请重新输入!")
148                     else:
149                         print("选项输入错误,请重新输入!")
150                 elif choice==‘q‘:   #退出账号登陆
151                     print("退出登陆!".center(50, ‘*‘))
152                     exit()
153                 else:
154                     print("选项输入错误,请重新输入!")
155             break
156         else:
157             print(‘用户名或密码错误,请重新输入!‘)
158
159 shopping_chart() #主程序运行

时间: 2024-10-22 07:05:36

Python程序练习3--模拟购物车的相关文章

rabbitmq的安装和命令介绍及python程序模拟生产者和消费者

[介绍] RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. RabbitMQ是流行的开源消息队列系统,用erlang语言开发 RabbitMQ是AMQP(高级消息队列协议)的标准实现 官网:http://www.rabbitmq.com/ [安装] 方式:yum/rpm 系统环境 [[email protected]_server scripts]# ifconfig | sed -n 's#.*inet addr:

第一个python程序,购物车

第一个pyhone程序,简单的购物车功能,刚开始学习,练习下手感. #/usr/bin/env python#-*- coding:utf-8 -*- salary = int(raw_input("请输入您的工资:").strip()) shop_list=[[1,'iphone6s',5800],[2,'mac book',9000],[3,'coff',32],[4,'python book',80],[5,'bicyle',1500]]user_list=[] print(''

python模拟购物车小项目

# 模拟购物车:# 要求:# 1,用户先给自己的账户充钱:比如先充3000元.# 2,有如下的一个格式:# goods = [{"name": "电脑", "price": 1999},# {"name": "鼠标", "price": 10},# {"name": "游艇", "price": 20},# {"nam

PHP会话——模拟购物车的功能

1.php默认是不开启会话的,要使用会话用两种方法:(1)使用session_start();显示的开启会话.(2)在php.ini中找到如下的一行:找到session.auto_start = 0,将0设置为1.下面通过一个模拟购物车的程序来展示seeion的基本操作. session1.php 1 <?php 2 //session_start(); 3 ?> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <title

[转] python程序的调试方法

qi09 原文 python程序的调试方法 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序 源码例子 例如,有模拟税收计算的程序: #!/usr/bin/python def debug_demo(val): if val <= 1600 : print "level 1" print 0 elif val <= 3500 : print "level 2" print (val - 1600) * 0.05 elif val

Python程序的执行原理(转载)

Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行. 2. 字节码 字节码在Python虚拟机程序里对应的是PyCodeObject对象..pyc文件是字节码在磁盘上的表现形式. 3. pyc文件 PyCodeObject对象的创建时机是模块加载的时候,即import.Python test.py会对test.py进行编译成字节码

Python程序退出方式(sys.exit() os._exit() os.kill() os.popen(...))

对于如何结束一个Python程序或者用Python操作去结束一个进程等,Python本身给出了好几种方法,而这些方式也存在着一些区别,对相关的几种方法看了并实践了下,同时也记录下. 参考: Python 核心编程(第二版) http://www.zhihu.com/question/21187839 1. sys.exit() 执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法. 该方法中包含一个参数status,默认为0,表示正常

月薪3万的python程序员都看了这本书

想必大家都看过吧 Python编程从入门到实践 全书共有20章,书中的简介如下: 本书旨在让你尽快学会 Python ,以便能够编写能正确运行的程序 —— 游戏.数据可视化和 Web 应用程序,同时掌握让你终身受益的基本编程知识.本书适合任何年龄的读者阅读,它不要求你有任何 Python 编程经验,甚至不要求你有编程经验.如果你想快速掌握基本的编程知识以便专注于开发感兴趣的项目,并想通过解决有意义的问题来检查你对新学概念的理解程度,那么本书就是为你编写的.本书还可供初中和高中教师用来通过开发项目

python程序调用C/C++代码

这篇用来记录在些模拟Canoe生成CAN数据桢工具时遇到的问题, 生成CAN数据桢,主要分为两个关注点: 1.如何从can信号名获取到can信号的ID长度以及信号的起始位,并将信号值按照一定的规则填写进去. 2.由于FCAN进行额checksum校验和activecount的规则,这部分算法使用C/C++最好,所以设计到python程序调用C/C++代码(也就是这篇文章) 1.如何用python调用C++代码: 这个是python官方库的cytpes模块的介绍,可以关注一下“Fundamenta