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以外的用户累计登录失败次数超过三次则锁定,此时需要管 ...
随机推荐
- struts1:Struts配置文件初解
struts-config.xml是Struts的核心文件.该文件可配置各种组件,包括,FormBeans,Actions,ActionMappings,全局转发GlobalForwards,数据源D ...
- CDZSC_2015寒假新人(1)——基础 e
Description Julius Caesar lived in a time of danger and intrigue. The hardest situation Caesar ever ...
- Marineking wilyin
A - Marineking wilyin Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Ot ...
- Hadoop学习之常用命令
HADOOP基本操作命令 在这篇文章中,我们默认认为Hadoop环境已经由运维人员配置好直接可以使用. 假设Hadoop的安装目录HADOOP_HOME为/home/admin/hadoop. 启动与 ...
- redis 未授权漏洞利用直接登录服务器
在没有查到杀手之前我是先把带宽&端口用iptables 做了限制这样能保证我能远程操作服务器才能查找原因 2 在各种netstat –ntlp 的查看下没有任何异常 在top 下查到了有异常 ...
- MySql小知识点
1.查看MySql是什么编码 show create table tablename;
- 理解ThreadLocal(一)
早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. Th ...
- git 快速使用(本地仓库同步到远程仓库)
学git一段时间,可惜公司用的是svn,平时少用,又忘了,总结一下,免得下次又得重新学习.得多多用才是正道! 一. 将本地的提交到网上git仓库 1.在git创建仓库 ...
- The package does not support the device architecture (x86). You can change the supported architectures in the Android Build section of the Project Opt
The package does not support the device architecture (x86). You can change the supported architectur ...
- thinkphp中的where()方法
where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...