python练习_购物车(2)
用python写了一个购物车程序,主要是练习,代码如下
主入口文件:main.py
#!/usr/bin/env python
# -*- coding:utf-8 -*- #先调用用户登录函数,在进行逻辑模块的循环
#入口程序 import enter,operate
if __name__ == '__main__':
print("\033[35m----------------------------请输入用户名密码----------------------------\033[0m")
enter.user()
while True:
operate.welcome()
入口
逻辑处理文件operate.py
#!/usr/bin/env python
# -*- coding:utf-8 -*- #逻辑结构
#主要判断用户的输入,根据输入的关键字,来调用不同功能的函数 #初始化商品
huowu = {
"iphone6splus" : 6000,
"huaweimate8" :3700,
"asus" :4299,
"alienware" :21999,
"strix-gtx970" :3649,
}
#初始化个空的购物车
huo = {
}
#初始化话空的列表,保存当前登录用户
name = []
#功能判断函数
def welcome():
import enter,os,lists
s_1 = raw_input("请输入操作:")#捕获用户操作
if s_1 == 'car':
enter.catg()
elif s_1 == 'help':
print('''\033[31m
car___________________商品
help__________________帮助
buy___________________添加至购物车
shop__________________购物车结算
und___________________购物车移除商品
top___________________充值
bal___________________余额
enr___________________注册用户
exit__________________返回
\033[0m''')
elif s_1 == 'buy':
enter.mone()
elif s_1 == 'shop':
print ("\033[35m-------------------------------已进入购物车-------------------------------\033[0m")
enter.shopp()
elif s_1 == 'und':
enter.dele()
elif s_1 == 'top':
enter.topup()
elif s_1 == 'bal':
b_1 = "\033[36m---------------------当前用户:{b_2},余额为:{b_3}----------------------\033[0m"
print b_1.format(b_2 = name[0],b_3 = lists.die[2])
elif s_1 == 'enr':
enter.login()
elif s_1 == 'exit':
os._exit(0)
逻辑处理
函数模块enter.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#读出当前存在的用户名和密码,并生成字典
with open('users','rU')as u_1 :
ss = u_1.readlines()
dic = dict()
for lind in ss:
lind = lind.strip().split(':')
dic[lind[0]] = lind[1]
#用户登录欢迎模块
def welcome(wel):
sent = "!\033[31m{users}\033[0m!Welcome to the shopping mall"#设置欢迎信息
aa = (sent.format(users=wel)) #欢迎信息
scr = 80 #设置一个长度
text = len(aa)-9 #读出语言的长度,并减去9
box = text #设置变量
left = (scr - box) // 2 #设置前方空格的空隙
#下方输出的内容可以根据输入字符串的长度进行变化
print #输出空
print ' ' * left + '+'+ '-'*(box) + '+'
print ' ' * left + '|'+ ' '*text + '|'
print ' ' * left + '|'+aa + '|'
print ' ' * left + '|'+ ' '*text + '|'
print ' ' * left + '+'+ '-'*(box) + '+' #用户登录验证模块
def user():
import operate #加载operate文件
while True: #设置循环
user_1 = raw_input("请输入你要登录的用户名:") #获取用户名密码
user_2 = raw_input("请输入你要登录的密码:")
operate.name.append(user_1) #将用户名写入operate.name,方便以后调用
if user_1 in dic.keys(): #判断当前用户是否存在,根据前面生成的所有用户名密码的列表
passw = dic[user_1] #如果用户存在则,根据字典的值传入变量
if user_2 == passw: #判断字典中密码和用户输入是否一致
welcome(user_1) #一致则调用用户欢迎模块
break #登录成功退出循环
else:
print("\033[35m您输入的账号或密码错误\033[0m")#不匹配则重新输出
print("")
else:
print("\033[35m您输入的账号或密码错误\033[0m")#不匹配则重新输出
print("") #购买模块
def shopp():
import operate #加载operate
if not operate.huo: #判断huo是否为空,huo是设置为空的字典,存放当前用户所添加的东西,
print("\033[35m-------------------------------购物车没货物-------------------------------\033[0m")#如果是空这输出
else: #不为空则结算
cart() #加载显示购物车物品的函数
shop_1 = raw_input("是否进行结算(y/n):") #是否结算
if shop_1 == "y" :#判断用户输入
deal() #调用结算模块
elif shop_1 == "n" :#判断用户输入
print ("\033[35m-------------------------------已退出购物车-------------------------------\033[0m")
#显示购物车内容
def cart():
import operate #加载operate
shop_1 = 1 #为物品编号设置
for sho_1 in operate.huo.keys(): #从用户的存放货物的字典逐个读取货物名称
if sho_1 in operate.huowu.keys(): ##分别读取货物的键值对,这里的逻辑不太好没时间更改,后续更改
#设置中间的下划线长度
sh_2 = len(sho_1) #计算长度
sh_3 = 50-sh_2 #设置下划线长度
ca_4 = ("[{s_1}]商品名称:{s_2}"+"_"*sh_3+"{s_3}元")#设置提示信息
print ca_4.format(s_1=shop_1,s_2=sho_1,s_3=operate.huo[sho_1])#设置提示信息
shop_1 += 1#将货物编号加一 #支付模块
def deal():
import operate,lists #加载operate,lists #支付过程
aas = int(lists.die[2]) #将lists的2索引(金额),转换成int类型
for sa in operate.huo.keys(): #sa从字典huo取key
sa_1 = int(operate.huo[sa]) #sa_1等于转换类型后的huo[sa]的值(购物车商品金额)
if aas >= sa_1: #判断文件中的当前用户金额是否大于等于huo[sa]的值
aas = aas - sa_1 #如果大于则进行运算用已存金额减去商品金额
lists.die[2] = aas #并将列表爹die[2](也就是用户的资金)更新成买完商品的钱
del operate.huo[sa] #然后删除该商品
ss_1 = '支付商品\033[35m{n}\033[0m成功,实付金额为:\033[31m{n_1}\033[0m元!' #设置提示信息
print ss_1.format(n=sa,n_1=sa_1) #设置提示信息
else:#当金钱不足的时候进行
ss_2 = '支付商品\033[35m{n}\033[0m失败,应付金额为:\033[31m{n_1}\033[0m元!请充值!'#设置提示信息
print ss_2.format(n=sa,n_1=sa_1)#设置提示信息
#写入文件过程,创建一个当前所有存在用户的列表,这样就可以判断当前用户在文件的第几行
clo = lists.dia.index(lists.aaa) #判断当前用户所在列表的位置
f=open('users','r+') #打开文件
flist=f.readlines() #按行读取
aa = '{a_1}:{a_2}:{a_3}\n' #设置文件内容
flist[clo]= aa.format(a_1=lists.die[0],a_2=lists.die[1],a_3=lists.die[2])#clo就是当前用户所在的文件行数,后面加上内容,a_1 当前用户 a_2 当前用户密码 a_3 当前用户余额
f=open('users','w') #以w的方式打开文件
f.writelines(flist) #写入
f.close()#关闭
print ("\033[35m-------------------------------已退出购物车-------------------------------\033[0m") #从购物车删除模块
def dele():
import operate #加载模块
if not operate.huo: #如果为空则输出没有货物
print("购物车没有物品")
else:
cart() #否则调用显示购物车模块
while True:#循环
saa = raw_input("请输入删除商品的名称:")#删除的物品名称
if saa == 'exit':#判断输入exit为退出
break
elif saa in operate.huo.keys():#判断用户输入名称是否正确
del operate.huo[saa] #正确则删除
print('\033[35m-------------------------------删除商品成功!!--------------------------------\033[0m')
#退出删除判断
saa_1 = raw_input("是否退出(y/n):")
if saa_1 == 'y':
break
else:
print "\033[31m您输入有误请重新输入\033[0m" #充值模块这里还可以写只有admin可以充值,或者验证充值用户的密码
def topup():
import lists#加载模块主要加载当前用户名
clb = lists.dia.index(lists.aaa) #判断当前用户所在列表的位置
while True:
q_1 = raw_input("请输入充值金额以整数为单位(元):") #输入充值金额
q_2 = str.isdigit(q_1) #判断是否是数字
if q_1 == 'exit' : #exit退出充值
break
if q_2 == True: #是数字则进行充值
q_1 = int(q_1) #转换类型
q_3 = type(q_1) #判断类型,主要通过长整形限制充值金额
if q_3 == int: #判断类型
lists.die[2] = int(lists.die[2]) #调用lists(当前用户的信息,账号,密码,余额),转换类型
lists.die[2] = lists.die[2] + q_1 #进行余额和充值金额相加
f=open('users','r+') #打开文件
flist=f.readlines() #按行读取
aa = '{a_1}:{a_2}:{a_3}\n' #设置文件内容
flist[clb]= aa.format(a_1=lists.die[0],a_2=lists.die[1],a_3=lists.die[2])#clo就是当前用户所在的文件行数,后面加上内容,a_1 当前用户 a_2 当前用户密码 a_3 当前用户金额
f=open('users','w') #以w的方式打开文件
f.writelines(flist) #写入
f.close() #关闭文件
vv_1 = ('充值成功,充值金额为\033[31m{vv}\033[0m,当前余额为\033[31m{v_1}\033[0m')
print(vv_1.format(vv=q_1,v_1=lists.die[2]))
break
else:#如果不是整形数字,是长整形数字则金额过大
print("\033[31m您输入的金额过大\033[0m")
else:#输入不是数字则输入有误
print("\033[31m---------------------------------输入有误---------------------------------\033[0m") #商品模块
def catg():
import operate#读取模块
print("\033[35m---------------------------------购物商品---------------------------------\033[0m")#输出
car = 1#设置商品编号
for ca_1 in operate.huowu:#分别读取货物的键值对
ca_2 = len(ca_1) #读出键值对的长度
ca_3 = 50-ca_2 #中间下划线长度
ca_4 = ("[{s_1}]商品名称:{s_2}"+"_"*ca_3+"{s_3}元")#输出信息
print ca_4.format(s_1=car,s_2=ca_1,s_3=operate.huowu[ca_1])#输出信息
car += 1
print("\033[35m---------------------------------购物商品---------------------------------\033[0m") #添加模块
def mone():
import operate
while True:#添加购物车模块
mon = raw_input("请输入加入购物车产品的名称:")#输入物品名称
if mon in operate.huo.keys(): #判断货物是否存在
print("\033[31m------------------------商品已经添加请先到购物车结算----------------------------\033[0m")
elif mon in operate.huowu.keys():#如果货物存在
print("\033[35m---------------------------添加成功请到购物车结算-------------------------------\033[0m")
operate.huo[mon] = operate.huowu[mon] #则添加至购物车的字典中
elif mon == "exit":#exit退出
print("\033[35m---------------------------------退出购物---------------------------------\033[0m")
break
else:#名称不对添加失败
print("\033[31m添加失败请核对产品名称\033[0m") #注册用户模块,这里还可以写只有admin可以创建用户
def login():
import lists
#为了防止在运行中能够创建多个相同名称的用户
while True:
with open('users','rU')as u_3: #过程如上
ads = u_3.readlines()
diz = []
for lin in ads:
lin = lin.strip().split(':')
diz.append(lin[0])
w_1 = raw_input("请输入创建的用户名:")#创建的用户名称
if w_1 in diz:#判断用户是否存在
print('\033[31m----------------------------用户已存在请重新输入------------------------------\033[0m')
elif w_1 == "exit":
break
else:
w_2 = raw_input("请输入用户密码(大于5位数)")#设置的密码这里可以做更安全的双向认证,因为PYcharm对隐身的密码模块支持不好所以没使用
w_3 = len(w_2)#计算密码长度
if w_3 > 5 :#密码长度大于5
output = open('users', 'a') #打开文件以a的方式
aa = '{a_1}:{a_2}:{a_3}\n' #设置文件内容
flist= aa.format(a_1=w_1,a_2=w_2,a_3=10000)#clo就是当前用户所在的文件行数,后面加上内容,a_1 当前用户 a_2 当前用户密码 a_3 当前用户余额
output.write(flist) #写入
output.close()#关闭文件
ll = "\033[31m--------------------------成功创建用户:{l_1}------------------------------\033[0m"
print ll.format(l_1=w_1)
break
else:
print("\033[31m----------------------------密码长度过短------------------------------\033[0m") #密码过短从新设置
函数模块
全局调用模块lists.py
#!/usr/bin/env python
# -*- coding:utf-8 -*- import operate
aaa = operate.name[0] #生成当前用户,信息的列表
with open('users','rU')as u_2 : #打开文件users
ss = u_2.readlines() #设置变量ss等于按行读取的u_2
die = [] #设置空列表,保存登录用户的信息
for line in ss: #for循环从ss按行拿区内容
if aaa in line: #判断登录用户是否在line中,当line包含用户的时候则进行一下处理
line = line.strip().split(':') #分割字符串
die.append(line[0]) #在列表中添加元素 0索引代表用户
die.append(line[1]) #在列表中添加元素 1索引代表密码
die.append(line[2]) #在列表中添加元素 2索引代表金额
#生成
with open('users','rU')as u_3: #过程如上
ads = u_3.readlines()
dia = []
for lin in ads:
lin = lin.strip().split(':')
dia.append(lin[0])
全局调用
用户数据保存文件:users
文件格式为:
admin:123.com:10000 主要实现思路:
(1)所有的用户数据存在users上,默认admin,123.com user,123.com
(2)实现思路在程序中捕获用户输入的关键字,借鉴linux,根据命令不同调用不同的
函数。
①商品展示功能,通过一个字典为商品,然后for循环,进行格式的输出前面的编
号利用计数器原理
②添加至购物车,主要当用户登录的时候生成一个空的字典,然后根据用户输入名称
与商品字典进行匹配,成功匹配后就加入空的字典,这里没使用序号加入
③购物车结算,在登录函数中将验证成功的用户名传入一个空的列表,通过将users
文件的数据读取出来,然后以:进行分割,转换成字典,这样就可以匹配当前登录
用户的余额,然后进行减的操作,并在购物车字典中删除此商品在写入的时候,
没学awk,所以采用指定的方法,为了获取用户在文件的行数,我先将所有用户
生成一个列表,然后进行匹配读出下标这样就可以正常的执行了
④删除商品,将匹配的用户输入,跟用户的购物车的字典匹配,然后删除
⑤充值,根据保存的用户列表,匹配文件中的用户余额,然后根据用户输入的金额进
行相加,写入文件,这里可以做只有admin才可以充值,限定单词充值金额啥的
⑥余额,根据前面生成的当前登录用户的信息列表进行输出
⑦注册用户,因为数据结构users就是,用户名,密码,金额,所以只需捕获用户名
密码就可,这里加入用户验证,不能生成相同名称,密码最短6位,为了防止重
副生成相同用户,在这里吧读取电当前用户名加入while循环,生成一次,下次
生成用户就加载一次。
(3)使用help可以输出帮助
python练习_购物车(2)的更多相关文章
- python练习_购物车(简版)
python练习_购物车(简版) 需求: 写一个python购物车可以输入用户初始化金额 可以打印商品,且用户输入编号,即可购买商品 购物时计算用户余额,是否可以购买物品 退出结算时打印购物小票 以下 ...
- Python练习_购物车_day6
第一次代码 (1) 输出商品列表,用户输入序号,显示用户选中的商品. 页面显示 序号 + 商品名称,如: 1 手机 2 电脑 (2): 用户输入选择的商品序号,然后打印商品名称 (3):如果用户输入的 ...
- python开发_++i,i += 1的区分
python开发_++i,i += 1的区分 在很多编程语言(C/C++,Java等)中我们都会碰到这样的语法: 1 int i = 0; 2 ++ i; // -- i; 这样的语法在上述编程语言中 ...
- python学习_数据处理编程实例(二)
在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...
- Python递归_打印节点信息
Python递归_打印节点信息 递归特性:1.必须由一个明确的结束条件2.每次进入更深一层递归时,问题规模相比上一次递归都应该有所减少3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时 ...
- python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学
首发于:python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=431 本文 ...
- python练习_三级菜单
python练习_三级菜单 需求: 做一个地区查询三级菜单,输入一级能够打印下一级 在第三级个第二级输入e可以返回上一级 在任意一级输入q则退出程序 以下代码实现的功能与思路: 功能: (1)通过In ...
- (转)Python作业day2购物车
Python作业day2购物车 原文:https://www.cnblogs.com/spykids/p/5163108.html 流程图: 实现情况: 可自主注册, 登陆系统可购物,充值(暂未实现) ...
- python练习_简单登录
python练习_简单登录 需求: 做一个登录的小程序,验证用户与密码 要求登录三次错误后锁定 以下代码实现的功能与思路: 功能: 1.除admin以外的用户累计登录失败次数超过三次则锁定,此时需要管 ...
随机推荐
- java 包之 BeanUtils包的使用
BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作. 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: (1) BeanUtils相 ...
- js 控制不能输入空格
onkeydown="if(event.keyCode==32) return false"
- php的多线程使用
PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间. 在liunx下的安装 准备工作: 1.下载Threa ...
- PHP学习笔记,curl,file_get_content,include和fopen四种方法获取远程文件速度测试.
这几天在做抓取.发现用PHP的file_get_contents函数来获取远程文件的过程中总是出现失败,并且效率很低下.所以就做了个测试的demo来测试下PHP中各种方法获取文件的速度. 程序里面使用 ...
- js禁止中文输入 最简洁的【禁止输入中文】
方法一:禁止中文输入法 <input type="text" > 方法二:禁止黏贴,禁止拖拽,禁止中文输入法! 这种方法是最强的禁止 中文输入 <input t ...
- 解决ERROR C2011: 'FD_SET' : 'STRUCT' TYPE REDEFINITION问题
在socket编程的过程中头文件中 #include <windows.h> #include "stdafx.h" #include "WinSock2.h ...
- windows程序设计读书笔记1——创建窗口
第一个win32程序,简单的创建窗口: #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ...
- A Survey of Dynamic Spectrum Access
这是2007年IEEE Signal Process 杂志上的一篇文章.综述DSA的.正如文章最后所说,DSA/OSA(Opportunity Spectrum Access)还处于襁褓期,在技术.政 ...
- Java的Git管理工具Gitblit
From:http://www.oschina.net/p/gitblit Gitblit 是一个纯 Java 库用来管理.查看和处理 Git 资料库.相当于 Git 的 Java 管理工具. 下载地 ...
- C#/winform 旅游管理信息系统
工具:Visual Studio 2015,sql server2014 1.系统概述 该旅游管理信息系统可以为游客和公司业务管理员提供服务.游客可以对旅游路线,旅游班次,旅游团,保险,导游,交通工具 ...