购物车程序:

1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表

2、允许用户根据商品编号购买商品

3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒

4、可随时退出,退出时,打印已购买商品和余额

5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示

6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买

7、允许查询之前的消费记录

用户验证使用之前博文中的程序,进行一定改动。主要是传参和调用后续的购物车程序。此处不再描述。

购物车入口:

m_shop.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Wang Yue import mode_shop,sys,random,os def show_me(shopcart,user_guest):
# 打印购买结果:
print("you choose:")
# 加工输出买得东西列表:按照每种货物的,货物名称,购买数量,单价/小计 的方式输出
with open("shopping_cart_db.doo", mode="a+", encoding="utf-8") as shop_cart_db:
for it in shopcart.get_items():
print(
"item name:\033[1;35m {_it_name} \033[0m!,num:\033[1;35m {_num} \033[0m!,val:\033[1;35m {_val} \033[0m!/\033[1;35m {_vals} \033[0m!".format(
_it_name=it[0].get_item_name(), _num=it[1], _val=it[0].get_item_value(),
_vals=it[0].get_item_value() * it[1]))
shop_cart_db.write("{shop_cart_id},{item_id},{_num}\n".format(shop_cart_id=shopcart.get_shopcart_id(),
item_id=it[0].get_item_id(), _num=it[1]))
# 输出购买总价格
# 输出兜兜里还剩下的钱数
with open("balance_db.doo", mode="a+", encoding="utf-8") as balance_db:
print("your user_id is \033[1;35m {u_id} \033[0m!".format(u_id=user_guest.get_user_id()))
print("all value is: \033[1;35m {_count} \033[0m!".format(_count=shopcart.get_count_val()))
print("you surplus:\033[1;35m {_my} \033[0m!".format(_my=user_guest.get_user_val()))
balance_db.write(
"{u_id},{cart_id},{val}\n".format(u_id=user_guest.get_user_id(), cart_id=shopcart.get_shopcart_id(),
val=user_guest.get_user_val())) if __name__ == "__main__":
items=[] #货物实例数组,存放的各种货物实例,与类中定义的items意义不同
shopcart=mode_shop.shopping_cart() #初始化购物车实例
#初始化货物实例
with open("item_db.doo",mode="r",encoding="utf-8") as item_db: #从文件数据源中读出每个货物,初始化货物实例并放入items列表
item_db.flush()
item_db.seek(0)
for it_info in item_db.readlines():
it_info=it_info.strip()
it_if=it_info.split(",")
items.append(mode_shop.item(int(it_if[0]),it_if[1],int(it_if[2])))
user_guest=mode_shop.user_guest() #初始化一个用户
in_user_id=sys.argv[1] if in_user_id:
#从装入之前的用户和购物车:
if os.path.exists("balance_db.doo"): #装载用户之前的购物车情况,建立用户和购物车的关联
with open("balance_db.doo",mode="r",encoding="utf-8") as load_user_db:
lu=load_user_db.readlines()
for load_user in lu :
load_user=load_user.strip()
l_user=load_user.split(",")
if in_user_id==l_user[0]: #仅仅读取一个用户
user_guest.set_user_id(l_user[0])
user_guest.set_shopcart_id(l_user[1])
user_guest.set_user_val(int(l_user[2]))
break
with open("balance_db.doo",mode="w",encoding="utf-8") as w_user_db: #装在后,需要将文件中,用户的涉及到的行删掉
for line in lu:
if str(user_guest.get_user_id()) in line:
continue
w_user_db.write(line) if user_guest.get_user_id() != 0: #如果从用户余额文件中存在用户,则开始关联购物车,关联后,就删除文件中的信息
if os.path.exists("shopping_cart_db.doo"):
with open("shopping_cart_db.doo",mode="r",encoding="utf-8") as cart_db:
c_lines=cart_db.readlines()
for cl in c_lines:
c_info=cl.split(",")
if user_guest.get_shopcart_id() == c_info[0]: #读取全部购物车信息
shopcart.set_shopcart_id(c_info[0])
for item in items:
if int(c_info[1]) == item.get_item_id():
shopcart.set_oneappend_item(item,int(c_info[2]))
with open("shopping_cart_db.doo",mode="w",encoding="utf-8") as w_cart_db:
for line in c_lines:
if shopcart.get_shopcart_id() in line:
continue
w_cart_db.write(line)
else:
pass if user_guest.get_shopcart_id() == 0:
#生成随机id,用于描述关联,
shopcart.set_shopcart_id("cart_{cart_id}".format(cart_id=random.randint(1000,9999)))
user_guest.set_user_id(sys.argv[1])
#描述用户和购物车的关联,就是让用户推个购物车去采购。
user_guest.set_shopcart_id(shopcart.get_shopcart_id()) #开始业务,输入逛超市带的钱数
have_val = int(input("your val:"))
user_guest.set_user_val(have_val) int_error = False # 初始化一个标记,是否进行业务
while not int_error: for it in items:
#输出每个货物的信息,展示给用户
print("id:{_id},{_name},val: {_val}".format(_id=it.get_item_id(),_name=it.get_item_name(),_val=it.get_item_value())) it_id=input("which one is you choice(id) or view or quit:")#接收想要购买的货物id,不是数字就退出,不是id就重新输入,是id进行业务 if it_id.isdigit():
it_id=int(it_id) #尝试转为整形
elif it_id == "view":
show_me(shopcart, user_guest)
else:
int_error=True if int_error: #如果输入的无法被转为数字,则认定是想结束程序,以下是结束过程
show_me(shopcart,user_guest)
sys.exit(0) for it in items: #在货物堆中找出想要买得货物
if it.get_item_id()== it_id:
it_num = input("how many {it_name} would you buy(int):".format(it_name=it.get_item_name()))
if it_num.isdigit():
it_num = int(it_num)
else:
print("you need input a number(int)")
break
if user_guest.get_user_val() < it.get_item_value()*it_num: #判定兜兜里的钱是否够买
print("your money is not enough!!!!")
break user_guest.set_user_val(user_guest.get_user_val()-it.get_item_value()*it_num) #钱够的话就买
shopcart.set_oneappend_item(it,it_num) #加入到购物车

定义类的文件mode_shop.py,货物类、购物车类、用户类:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Wang Yue class shopping_cart(object):
def __init__(self):
self.items=[] #定义的二维数组,存放内容的单元素为[item,num]
self.count_value=0
self.id=0
def set_oneappend_item(self,item,num): #加入一个货物,如果加过,就仅累加该货物的数量,否则加入新的元素。
for its in self.items:
if its[0].get_item_id() == item.get_item_id():
its[1]=num+its[1]
break
else:
self.items.append([item,num]) def get_items(self): #获取购物车上的货物,及数量,就是那个二维数组
return self.items
def get_count_val(self):#获取购物车上当前的总价格,二维数组中的定义是货物和数量,所以算法如下。太粗暴了
for item in self.items:
self.count_value=self.count_value+item[0].get_item_value()*item[1]
return self.count_value
def set_shopcart_id(self,sc_id):
self.id=sc_id
def get_shopcart_id(self):
return self.id class item(object): #货物类
def __init__(self,it_id,it_name,it_value):
self.item_id=it_id #货物id
self.item_name=it_name #货物名称
self.item_value=it_value #货物单价 def set_item_name(self,it_name):
self.item_name=it_name
def get_item_name(self):
return self.item_name def set_item_value(self,it_val):
self.item_value=it_val
def get_item_value(self):
return self.item_value def set_item_id(self,it_id):
self.item_id=it_id
def get_item_id(self):
return self.item_id class user_guest(object):
def __init__(self):
self.user_id=0
self.shopcart_id=0
self.val=0
def set_user_id(self,u_id):
self.user_id=u_id
def get_user_id(self):
return self.user_id
def set_shopcart_id(self,sc_id):
self.shopcart_id=sc_id
def get_shopcart_id(self):
return self.shopcart_id
def set_user_val(self,val):
self.val=val
def get_user_val(self):
return self.val

附:用的文件作为数据源:

存放购物车货物存放信息shopping_cart_db.doo:

cart_4871,3,6
cart_4871,4,6
cart_4871,3,6
cart_4871,4,6

存放货物信息item_db.doo:

1,iphone,10000
2,bag,300
3,book,50
4,note,5
5,smoke,8
6,box,10
7,fire,1
8,table,3000
9,pc,7000

存放已经存放货物关联信息balance_db.doo:

user_2592,cart_4871,49550
user_2592,cart_4871,49550

维护商品的脚本:supply_item.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author : Wang Yue import sys while True:
print('''cmd:
view : all items
insert : id(int),name(str),price(int) insert one into DB
update: id(int),name(str),price(int) update one from DB
delete: id(int) delete one from DB
quit: quit me
''')
cmd=input("cmd>> ")
command=cmd.split()
if command[0] == "view":
with open("item_db.doo",mode="r",encoding="utf-8") as view_db:
lines=view_db.readlines()
for line in lines:
line=line.strip()
print(line)
elif command[0] == "insert":
with open("item_db.doo",mode="a+",encoding="utf-8") as apd_db:
item=input("item info:")
it_info=item.split(",")
if len(it_info) == 3:
apd_db.write("{id},{name},{prc}\n".format(id=it_info[0],name=it_info[1],prc=it_info[2]))
else:
continue
elif command[0] == "update":
with open("item_db.doo",mode="r",encoding="utf-8") as r_it_db:
lines=r_it_db.readlines()
info=input("item info>> (id,name,prc):")
info=info +"\n"
info_id=info.split(",")
is_break=0
for line in lines:
line_old = line.split(",")
if info_id[0] != line_old[0]:
is_break=1
else:
is_break=0
break
if is_break==1:
print("not found it from DB")
continue
with open("item_db.doo",mode="w",encoding="utf-8") as w_it_db:
for line_n in lines:
if info_id[0] == line_n[0]:
line_n=info
w_it_db.write(line_n) elif command[0] == "delete":
with open("item_db.doo",mode="r",encoding="utf-8") as dr_it_db:
lines=dr_it_db.readlines()
d_info=input("input item's id:")
with open("item_db.doo",mode="w",encoding="utf-8") as dw_it_db:
for line_n in lines:
line_n_l=line_n.split(",")
if line_n_l[0]==d_info:
continue
dw_it_db.write(line_n)
elif command[0] =="quit":
sys.exit(0)
break
else:
continue

python3.x Day2 购物车程序练习的更多相关文章

  1. Python之路 day2 购物车小程序1

    #Author:ersa ''' 程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时 ...

  2. Python3学习之路~2.2 简单的购物车程序

    程序:购物车程序 需求:启动程序后,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 代码 ...

  3. Python学习-购物车程序

    程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 ...

  4. 利用JSP编程技术实现一个简单的购物车程序

    实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP ...

  5. 简单购物车程序(Python)

    #简单购物车程序:money_all=0tag=Trueshop_car=[]shop_info={'apple':10,'tesla':100000,'mac':3000,'lenovo':3000 ...

  6. python学习:购物车程序

    购物车程序 product_list = [ ('mac',9000), ('kindle',800), ('tesla',900000), ('python book',105), ('bike', ...

  7. python复习购物车程序

    个人学习总结: 无他,唯手熟尔!多敲多练才是王道 python 第三课 元组的灵活运用&字符串的诸多操作 Program01 '''时间 2018年2月12日12:15:28目的 购物车程序 ...

  8. python元组与购物车程序

    #Author:zww ''' 程序:购物车程序 需求: 1.启动程序后,让用户输入工资,然后打印呢商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否足够,够就直接扣款,不够 ...

  9. 实用的php购物车程序

    实用的php教程购物车程序以前有用过一个感觉不错,不过看了这个感觉也很好,所以介绍给需要的朋友参考一下. <?php//调用实例require_once 'cart.class.php';ses ...

随机推荐

  1. Android下拉刷新

    以下是我自己花功夫编写了一种非常简单的下拉刷新实现方案,现在拿出来和大家分享一下.相信在阅读完本篇文章之后,大家都可以在自己的项目中一分钟引入下拉刷新功能 最近项目中需要用到ListView下拉刷新的 ...

  2. Tarjan求桥

    传送门(poj3177) 这道题是Tarjan求桥的模板题.大意是要求在原图上加上数量最少的边,使得整张图成为一个边双联通分量. 具体的做法是,先在图中求出所有的桥,之后把边双联通分量缩成点,这样的话 ...

  3. JeePlus:项目部署

    ylbtech-JeePlus:项目部署 1.返回顶部 1. 项目部署 1 开发工具:idea/eclipse/myeclipse+ mysql/oracle+tomcat6/7/8. 下面以ecli ...

  4. Flask-SQLAlchemy - 不使用外键连表查询。记得常回来看我

    前言 相比于 Django 的 ORM ,SQLAlchemy "不依靠外键进行跨表联查" 的解决方案就比较多. 没啥好说的,只能怪自己学艺不精..  _(:з」∠)_ 解决办法 ...

  5. robotframework - selenium 分层思路

    前言: 对于每一条用例来说,调用“百度搜索”关键字,输入搜索内容,输入预期结果即可.不同关心用例是如何执行的.如果百度输入框的定位发生了变化,只用去修改“百度搜索”关键字即可,不用对每一条用例做任何修 ...

  6. 学习css盒子模型

    在这一周,我学习了css,在没有学习css之前,我一直都觉得布局很难,样式特别难调,但是学习了css盒子模型之后我就觉得欸,其实还挺简单的,下面就来看看我学习的css吧. CSS 盒子模型(Box M ...

  7. eslint 的配置

    安装 可以全局安装,也可以在项目下面安装. 如下是在项目中安装示例,只需要在 package.json 中添加如下配置,并进行安装: >"eslint": "^4. ...

  8. 关于ListView的注意点

    解决ListView的一些常见问题: 1.listview在拖动的时候背景图片消失变成黑色背景,等到拖动完毕我们自己的背景图片才显示出来 解决:在XML中加入 android:scrollingCac ...

  9. Android 性能优化(12)网络优化( 8)Monitoring the Battery Level and Charging State

    Monitoring the Battery Level and Charging State PreviousNext This lesson teaches you to Determine th ...

  10. win7任务计划提示”该任务映像已损坏或已篡改“怎么处理

    https://jingyan.baidu.com/article/e75057f2038e2febc91a8915.html 在命令行窗口(cmd)执行命令:schtasks /query /v   ...