python练习_购物车(2)

用python写了一个购物车程序,主要是练习,代码如下

主入口文件:main.py

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 #先调用用户登录函数,在进行逻辑模块的循环
 5 #入口程序
 6 
 7 import enter,operate
 8 if __name__ == '__main__':
 9     print("33[35m----------------------------请输入用户名密码----------------------------33[0m")
10     enter.user()
11     while True:
12         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('''33[31m
                       car___________________商品
                       help__________________帮助
                       buy___________________添加至购物车
                       shop__________________购物车结算
                       und___________________购物车移除商品
                       top___________________充值
                       bal___________________余额
                       enr___________________注册用户
                       exit__________________返回
       33[0m''')
    elif s_1  == 'buy':
        enter.mone()
    elif s_1  == 'shop':
        print ("33[35m-------------------------------已进入购物车-------------------------------33[0m")
        enter.shopp()
    elif s_1  == 'und':
        enter.dele()
    elif s_1  == 'top':
        enter.topup()
    elif s_1  == 'bal':
        b_1 = "33[36m---------------------当前用户:{b_2},余额为:{b_3}----------------------33[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

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 #读出当前存在的用户名和密码,并生成字典
  4 with open('users','rU')as u_1 :
  5             ss =  u_1.readlines()
  6             dic = dict()
  7             for lind in ss:
  8                 lind = lind.strip().split(':')
  9                 dic[lind[0]] = lind[1]
 10 #用户登录欢迎模块
 11 def welcome(wel):
 12     sent = "!33[31m{users}33[0m!Welcome to the shopping mall"#设置欢迎信息
 13     aa = (sent.format(users=wel)) #欢迎信息
 14     scr = 80    #设置一个长度
 15     text = len(aa)-9    #读出语言的长度,并减去9
 16     box = text  #设置变量
 17     left = (scr - box) // 2     #设置前方空格的空隙
 18     #下方输出的内容可以根据输入字符串的长度进行变化
 19     print   #输出空
 20     print ' ' * left + '+'+ '-'*(box) + '+'
 21     print ' ' * left + '|'+ ' '*text + '|'
 22     print ' ' * left + '|'+aa + '|'
 23     print ' ' * left + '|'+ ' '*text + '|'
 24     print ' ' * left + '+'+ '-'*(box) + '+'
 25 
 26 
 27 #用户登录验证模块
 28 def user():
 29     import operate #加载operate文件
 30     while True: #设置循环
 31         user_1 = raw_input("请输入你要登录的用户名:") #获取用户名密码
 32         user_2 = raw_input("请输入你要登录的密码:")
 33         operate.name.append(user_1) #将用户名写入operate.name,方便以后调用
 34         if user_1 in dic.keys():    #判断当前用户是否存在,根据前面生成的所有用户名密码的列表
 35             passw = dic[user_1]     #如果用户存在则,根据字典的值传入变量
 36             if user_2 == passw:     #判断字典中密码和用户输入是否一致
 37                 welcome(user_1)     #一致则调用用户欢迎模块
 38                 break               #登录成功退出循环
 39             else:
 40                 print("33[35m您输入的账号或密码错误33[0m")#不匹配则重新输出
 41                 print("")
 42         else:
 43                 print("33[35m您输入的账号或密码错误33[0m")#不匹配则重新输出
 44                 print("")
 45 
 46 
 47 #购买模块
 48 def shopp():
 49     import operate  #加载operate
 50     if not operate.huo: #判断huo是否为空,huo是设置为空的字典,存放当前用户所添加的东西,
 51         print("33[35m-------------------------------购物车没货物-------------------------------33[0m")#如果是空这输出
 52     else: #不为空则结算
 53         cart() #加载显示购物车物品的函数
 54         shop_1 = raw_input("是否进行结算(y/n):") #是否结算
 55         if shop_1 == "y" :#判断用户输入
 56             deal()  #调用结算模块
 57         elif shop_1 == "n" :#判断用户输入
 58             print ("33[35m-------------------------------已退出购物车-------------------------------33[0m")
 59 #显示购物车内容
 60 def cart():
 61     import operate  #加载operate
 62     shop_1 = 1  #为物品编号设置
 63     for sho_1 in operate.huo.keys():    #从用户的存放货物的字典逐个读取货物名称
 64         if sho_1 in operate.huowu.keys():   ##分别读取货物的键值对,这里的逻辑不太好没时间更改,后续更改
 65             #设置中间的下划线长度
 66             sh_2 = len(sho_1)   #计算长度
 67             sh_3 = 50-sh_2      #设置下划线长度
 68             ca_4 = ("[{s_1}]商品名称:{s_2}"+"_"*sh_3+"{s_3}元")#设置提示信息
 69             print ca_4.format(s_1=shop_1,s_2=sho_1,s_3=operate.huo[sho_1])#设置提示信息
 70             shop_1 += 1#将货物编号加一
 71 
 72 
 73 
 74 #支付模块
 75 def deal():
 76     import operate,lists #加载operate,lists
 77 
 78     #支付过程
 79     aas = int(lists.die[2])   #将lists的2索引(金额),转换成int类型
 80     for sa in operate.huo.keys(): #sa从字典huo取key
 81         sa_1 = int(operate.huo[sa])     #sa_1等于转换类型后的huo[sa]的值(购物车商品金额)
 82         if aas >= sa_1:       #判断文件中的当前用户金额是否大于等于huo[sa]的值
 83             aas = aas - sa_1   #如果大于则进行运算用已存金额减去商品金额
 84             lists.die[2] = aas       #并将列表爹die[2](也就是用户的资金)更新成买完商品的钱
 85             del operate.huo[sa]    #然后删除该商品
 86             ss_1 = '支付商品33[35m{n}33[0m成功,实付金额为:33[31m{n_1}33[0m元!' #设置提示信息
 87             print ss_1.format(n=sa,n_1=sa_1)   #设置提示信息
 88         else:#当金钱不足的时候进行
 89             ss_2 = '支付商品33[35m{n}33[0m失败,应付金额为:33[31m{n_1}33[0m元!请充值!'#设置提示信息
 90             print ss_2.format(n=sa,n_1=sa_1)#设置提示信息
 91     #写入文件过程,创建一个当前所有存在用户的列表,这样就可以判断当前用户在文件的第几行
 92     clo = lists.dia.index(lists.aaa)    #判断当前用户所在列表的位置
 93     f=open('users','r+')    #打开文件
 94     flist=f.readlines()     #按行读取
 95     aa = '{a_1}:{a_2}:{a_3}
'  #设置文件内容
 96     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 当前用户余额
 97     f=open('users','w') #以w的方式打开文件
 98     f.writelines(flist) #写入
 99     f.close()#关闭
100     print ("33[35m-------------------------------已退出购物车-------------------------------33[0m")
101 
102 #从购物车删除模块
103 def dele():
104     import operate  #加载模块
105     if not operate.huo: #如果为空则输出没有货物
106         print("购物车没有物品")
107     else:
108         cart()  #否则调用显示购物车模块
109         while True:#循环
110             saa = raw_input("请输入删除商品的名称:")#删除的物品名称
111             if saa == 'exit':#判断输入exit为退出
112                 break
113             elif saa in operate.huo.keys():#判断用户输入名称是否正确
114                 del operate.huo[saa]    #正确则删除
115                 print('33[35m-------------------------------删除商品成功!!--------------------------------33[0m')
116                 #退出删除判断
117                 saa_1 = raw_input("是否退出(y/n):")
118                 if saa_1 == 'y':
119                     break
120             else:
121                 print "33[31m您输入有误请重新输入33[0m"
122 
123 #充值模块这里还可以写只有admin可以充值,或者验证充值用户的密码
124 def topup():
125     import lists#加载模块主要加载当前用户名
126     clb = lists.dia.index(lists.aaa)    #判断当前用户所在列表的位置
127     while True:
128         q_1 = raw_input("请输入充值金额以整数为单位(元):")    #输入充值金额
129         q_2 = str.isdigit(q_1)  #判断是否是数字
130         if q_1 == 'exit' :  #exit退出充值
131             break
132         if q_2 == True: #是数字则进行充值
133             q_1 = int(q_1)  #转换类型
134             q_3 = type(q_1) #判断类型,主要通过长整形限制充值金额
135             if q_3 == int:  #判断类型
136                 lists.die[2] = int(lists.die[2])    #调用lists(当前用户的信息,账号,密码,余额),转换类型
137                 lists.die[2] = lists.die[2] + q_1   #进行余额和充值金额相加
138                 f=open('users','r+')    #打开文件
139                 flist=f.readlines()     #按行读取
140                 aa = '{a_1}:{a_2}:{a_3}
'  #设置文件内容
141                 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 当前用户金额
142                 f=open('users','w') #以w的方式打开文件
143                 f.writelines(flist) #写入
144                 f.close()  #关闭文件
145                 vv_1 = ('充值成功,充值金额为33[31m{vv}33[0m,当前余额为33[31m{v_1}33[0m')
146                 print(vv_1.format(vv=q_1,v_1=lists.die[2]))
147                 break
148             else:#如果不是整形数字,是长整形数字则金额过大
149                 print("33[31m您输入的金额过大33[0m")
150         else:#输入不是数字则输入有误
151             print("33[31m---------------------------------输入有误---------------------------------33[0m")
152 
153 
154 #商品模块
155 def catg():
156     import operate#读取模块
157     print("33[35m---------------------------------购物商品---------------------------------33[0m")#输出
158     car = 1#设置商品编号
159     for ca_1 in operate.huowu:#分别读取货物的键值对
160         ca_2 = len(ca_1)    #读出键值对的长度
161         ca_3 = 50-ca_2  #中间下划线长度
162         ca_4 = ("[{s_1}]商品名称:{s_2}"+"_"*ca_3+"{s_3}元")#输出信息
163         print ca_4.format(s_1=car,s_2=ca_1,s_3=operate.huowu[ca_1])#输出信息
164         car += 1
165     print("33[35m---------------------------------购物商品---------------------------------33[0m")
166 
167 
168 #添加模块
169 def mone():
170     import operate
171     while True:#添加购物车模块
172         mon = raw_input("请输入加入购物车产品的名称:")#输入物品名称
173         if mon in operate.huo.keys():   #判断货物是否存在
174             print("33[31m------------------------商品已经添加请先到购物车结算----------------------------33[0m")
175         elif mon in operate.huowu.keys():#如果货物存在
176             print("33[35m---------------------------添加成功请到购物车结算-------------------------------33[0m")
177             operate.huo[mon] = operate.huowu[mon] #则添加至购物车的字典中
178         elif mon == "exit":#exit退出
179             print("33[35m---------------------------------退出购物---------------------------------33[0m")
180             break
181         else:#名称不对添加失败
182             print("33[31m添加失败请核对产品名称33[0m")
183 
184 #注册用户模块,这里还可以写只有admin可以创建用户
185 def login():
186     import  lists
187     #为了防止在运行中能够创建多个相同名称的用户
188     while True:
189         with open('users','rU')as u_3:  #过程如上
190             ads = u_3.readlines()
191             diz = []
192             for lin in ads:
193                 lin = lin.strip().split(':')
194                 diz.append(lin[0])
195         w_1 = raw_input("请输入创建的用户名:")#创建的用户名称
196         if w_1 in diz:#判断用户是否存在
197             print('33[31m----------------------------用户已存在请重新输入------------------------------33[0m')
198         elif w_1 == "exit":
199             break
200         else:
201             w_2 = raw_input("请输入用户密码(大于5位数)")#设置的密码这里可以做更安全的双向认证,因为PYcharm对隐身的密码模块支持不好所以没使用
202             w_3 = len(w_2)#计算密码长度
203             if w_3 > 5 :#密码长度大于5
204                 output = open('users', 'a') #打开文件以a的方式
205                 aa = '{a_1}:{a_2}:{a_3}
'  #设置文件内容
206                 flist= aa.format(a_1=w_1,a_2=w_2,a_3=10000)#clo就是当前用户所在的文件行数,后面加上内容,a_1 当前用户 a_2 当前用户密码 a_3 当前用户余额
207                 output.write(flist) #写入
208                 output.close()#关闭文件
209                 ll = "33[31m--------------------------成功创建用户:{l_1}------------------------------33[0m"
210                 print ll.format(l_1=w_1)
211                 break
212             else:
213                 print("33[31m----------------------------密码长度过短------------------------------33[0m") #密码过短从新设置
函数模块

全局调用模块lists.py

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import operate
 5 aaa = operate.name[0]
 6 
 7 
 8 
 9 #生成当前用户,信息的列表
10 with open('users','rU')as u_2 :     #打开文件users
11         ss =  u_2.readlines()      #设置变量ss等于按行读取的u_2
12         die = []                    #设置空列表,保存登录用户的信息
13         for line in ss:             #for循环从ss按行拿区内容
14             if aaa in line:         #判断登录用户是否在line中,当line包含用户的时候则进行一下处理
15                 line = line.strip().split(':')  #分割字符串
16                 die.append(line[0])     #在列表中添加元素 0索引代表用户
17                 die.append(line[1])     #在列表中添加元素 1索引代表密码
18                 die.append(line[2])     #在列表中添加元素 2索引代表金额
19 #生成
20 with open('users','rU')as u_3:  #过程如上
21     ads = u_3.readlines()
22     dia = []
23     for lin in ads:
24         lin = lin.strip().split(':')
25         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可以输出帮助



原文地址:https://www.cnblogs.com/bj-xy/p/5132519.html