python,希望能帮我找一下下面代码中存在的bug,并且能提出解决办法,最好是直接能有个新的代码
'''原程序
https://www.cnblogs.com/zhangxinqi/p/7593011.html'''
'''登陆购物车:'''
#!/usr/bin/env python
#coding:utf8
#file:Administrator
#time:20170926
import sys,os
#用户密码字典
name_pass = {'user1': '123', 'user2': '456', 'user3': '789'}
#商品列表
shop_list = [
['iphone7', 6500],
['iphone6', 4500],
['金立s10', 3400],
['华为r79', 2888],
['魅族NOTE5', 1888],
['oppoR9', 3600], ]
shop_out = [] #购物车
all_kaixiao = 0 #统计值
#统计三次用户错误锁定
count = 0
for i in range(10):
name_input = input('请输入用户名:')
if name_input in name_pass.keys(): #判断用户存在否
passwd_input = input('请输入密码:')
if passwd_input == name_pass[name_input]: #判断对应用户密码
print('恭喜登陆成功!')
break
else:
if count > 1:
print('3次输入错误,您账号已锁定')
break
print('{}用户名不存在或密码错误,请重新输入!'.format(name_input))
count += 1
else:
print('{}用户不存在'.format(name_input))
continue
money = eval(input('请输入你的预购金额:'))
print('++++++++++商品清单++++++++++++++')
for num, i in enumerate(shop_list, 1):
if isinstance(i, list):
shop_li = i[0]+"\t"+str(i[1])
print(num, shop_li)
else:
print(i)
print('q 退出\n p 打印清单')
while True:
shop_name = input('\n请输入要购买的商品编号:')
shop_name = str(shop_name)
if shop_name == 'q':
exit()
elif shop_name == 'p': #打印购物明细
print('------购物明细------')
for number, i in enumerate(shop_out, 1):
if isinstance(i, list):
hehe = i[0]+":"+str(i[1])
print(number, hehe)
else:
print(number, i)
print('---总计金额:%s---' % (all_kaixiao))
continue #跳出循环,不然会输出非法信息
if shop_name.isdigit() == 1: #判断是否为数字
shop_name = int(shop_name)
else:
print('您的输入非法,请重新输入')
continue
unm1 = int(len(shop_list))
if shop_name not in range(1, unm1+1): #判断输入商品编号是否在序列中
print('输入有误,请重新输入!')
continue
else:
price = int(shop_list[shop_name - 1][1]) #商品单价
if money < price:
print('您的金额不足,无法购买')
continue
money = money - price # 剩余金额
out = shop_list[shop_name - 1][:] # 购买商品信息
shop_out.append(out[:]) # 加入购物车
all_kaixiao += price #汇总消费
print('您购买的商品是:{}单价:{}元'.format(*out))
print('您还可以消费:{}'.format(money))
你的代码整体缩进应该有问题,我已全部修改并跑通,贴了运行图片,另位代码不需要sys和os模块,可以删掉。记得采纳哦!
#统计三次用户错误锁定
count = 0
#用户密码字典
name_pass = {'user1':'123','user2':'456','user3':'789'}
#商品列表
shop_list = [
['iphone7',6500],
['iphone6',4500],
['金立s10',3400],
['华为r79',2888],
['魅族NOTE5',1888],
['opppR9',3600],
]
for i in range(10):
name_input = input('请输入用户名:')
if name_input in name_pass.keys(): #判断用户存在否
passwd_input = input('请输入密码:')
if passwd_input == name_pass[name_input]: #判断对应用户密码
print('恭喜登陆成功!')
break
else:
if count > 1:
print('3次输入错误,您账号已锁定')
exit()
print('{}用户名不存在或密码错误,请重新输入!'.format(name_input))
count += 1
else:
print('{}用户不存在'.format(name_input))
continue
money = eval(input('请输入你的预购金额:'))
shop_out = [] #购物车
all_kaixiao = 0 #统计值
while True:
print('++++++++++商品清单++++++++++++++')
for num,i in enumerate(shop_list,1):
if isinstance(i,list):
shop_li = i[0]+"\t"+str(i[1])
print(num,shop_li)
else:
print(i)
print('q:退出\np:打印清单')
shop_name = input('请输入要购买的商品编号:')
shop_name = str(shop_name)
if shop_name == 'q':
exit()
elif shop_name == 'p': #打印购物明细
print('------购物明细------')
for number,i in enumerate(shop_out,1):
if isinstance(i,list):
hehe = i[0]+":"+str(i[1])
print(number,hehe)
else:
print(number,i)
print('---总计金额:%s---'%(all_kaixiao))
continue #跳出循环,不然会输出非法信息
if shop_name.isdigit() == 1: #判断是否为数字
shop_name = int(shop_name)
else:
print('您的输入非法,请重新输入')
continue
unm1 = int(len(shop_list))
if shop_name not in range(1,unm1+1): #判断输入商品编号是否在序列中
print('输入有误,请重新输入!')
continue
else:
price = int(shop_list[shop_name - 1][1]) #商品单价
if money < price:
print('您的金额不足,无法购买')
continue
money = money - price # 剩余金额
out = shop_list[shop_name - 1][:] # 购买商品信息
shop_out.append(out[:]) # 加入购物车
all_kaixiao +=price #汇总消费
print('您购买的商品是:{}单价:{}元'.format(*out))
print('您还可以消费:{}'.format(money))
完美,没毛病,至少目前我没看出BUG,学习了,刚好正在学python中
没啥😋bug就是有些逻辑不合理
加了用户注册和一些其他提示
'''原程序
https://www.cnblogs.com/zhangxinqi/p/7593011.html'''
'''登陆购物车:'''
# !/usr/bin/env python
# coding:utf8
# file:Administrator
# time:20170926
import sys, os
# 用户密码字典
name_pass = {'user1': '123', 'user2': '456', 'user3': '789'}
# 商品列表
shop_list = [
['iphone7', 6500],
['iphone6', 4500],
['金立s10', 3400],
['华为r79', 2888],
['魅族NOTE5', 1888],
['oppoR9', 3600], ]
shop_out = [] # 购物车
all_kaixiao = 0 # 统计值
# 统计三次用户错误锁定
count = 0
while True:
name_input = input('请输入用户名:')
if name_input in name_pass.keys(): # 判断用户存在否
passwd_input = input('请输入密码:')
if passwd_input == name_pass[name_input]: # 判断对应用户密码
print('恭喜登陆成功!')
while True:
print('++++++++++商品清单++++++++++++++')
for num, i in enumerate(shop_list, 1):
if isinstance(i, list):
shop_li = i[0] + "\t" + str(i[1])
print(num, shop_li)
else:
print(i)
shop_name = input('\n请输入要购买的商品编号:')
if shop_name.lower() == 'q':
exit()
elif shop_name.lower() == 'p': # 打印购物明细
print('------购物明细------')
print('---总计金额:%s---' % (all_kaixiao))
continue # 跳出循环,不然会输出非法信息
if shop_name.isdigit(): # 判断是否为数字
if int(shop_name) <= len(shop_list):
shop_name = int(shop_name)
else:
print('商品编号不存在')
continue
else:
print('您的输入非法,请重新输入')
continue
money = eval(input('请输入你的预购金额:'))
unm1 = int(len(shop_list))
if shop_name not in range(1, unm1 + 1): # 判断输入商品编号是否在序列中
print(f'输入有误,请重新输入!商品{shop_name}不存在')
continue
else:
price = int(shop_list[shop_name - 1][1]) # 商品单价
if money < price:
print('您的金额不足,无法购买')
continue
money = money - price # 剩余金额
out = shop_list[shop_name - 1][:] # 购买商品信息
shop_out.append(out[:]) # 加入购物车
all_kaixiao += price # 汇总消费
print('您购买的商品是:{}单价:{}元'.format(*out))
print('您还可以消费:{}'.format(money))
else:
if count > 1:
print('3次输入错误,您账号已锁定')
break
print('{}用户名不存在或密码错误,请重新输入!'.format(name_input))
count += 1
else:
print('{}用户不存在'.format(name_input))
reg = input("是否注册新用户?(Y/N)")
if reg.lower() == "y":
user = input('请输入新用户名:')
pwd = input('请输入密码:')
name_pass[user] = pwd
continue
逻辑上的bug。。。输错用户10次就直接进入购买界面了,所以这里最好在for循环结束后加一个flag,用来决定用户是否成功登录,还是已经错了10次,如果成功登录,则继续下面的程序,不然则退出。
改进了部分代码
'''原程序
https://www.cnblogs.com/zhangxinqi/p/7593011.html'''
'''登陆购物车:'''
#!/usr/bin/env python
#coding:utf8
#file:Administrator
#time:20170926
"""
改进:
1.将登录改成死循环,信息不对无法登录
2.新增锁定用户列表
3.新增输入用户名后判断是否在锁定用户列表中
4.输入密码次数3次以后将该用户锁定
5.将商品信息放进while循环中,方便查看商品
"""
#用户密码字典
name_pass = {'user1': '123', 'user2': '456', 'user3': '789'}
#商品列表
shop_list = [
['iphone7', 6500],
['iphone6', 4500],
['金立s10', 3400],
['华为r79', 2888],
['魅族NOTE5', 1888],
['oppoR9', 3600], ]
shop_out = [] #购物车
all_kaixiao = 0 #统计值
# 锁定用户
lock_user = []
while True:
#统计三次用户错误锁定
count = 0
name_input = input('请输入用户名:')
if name_input in name_pass.keys(): #判断用户存在否
while count < 3:
passwd_input = input('请输入密码:')
if passwd_input == name_pass[name_input]: #判断对应用户密码
print('恭喜登陆成功!')
break
else:
print('用户{}密码错误,请重新输入!'.format(name_input))
count += 1
continue
if count > 2:
print('3次输入错误,用户{}账号已锁定'.format(name_input))
if name_input not in lock_user:
lock_user.append(name_input)
else:
break
elif name_input in lock_user:
print("该账户已锁定")
continue
else:
print('{}用户不存在'.format(name_input))
continue
money = eval(input('请输入你的预购金额:'))
while True:
print('++++++++++商品清单++++++++++++++')
for num, i in enumerate(shop_list, 1):
if isinstance(i, list):
shop_li = i[0]+"\t"+str(i[1])
print(num, shop_li)
else:
print(i)
print('q 退出\n p 打印清单')
shop_name = input('\n请输入你的选择:')
shop_name = str(shop_name)
if shop_name == 'q':
exit()
elif shop_name == 'p': #打印购物明细
print('------购物明细------')
for number, i in enumerate(shop_out, 1):
if isinstance(i, list):
hehe = i[0]+":"+str(i[1])
print(number, hehe)
else:
print(number, i)
print('---总计金额:%s---' % (all_kaixiao))
continue #跳出循环,不然会输出非法信息
if shop_name.isdigit() == 1: #判断是否为数字
shop_name = int(shop_name)
else:
print('您的输入非法,请重新输入')
continue
unm1 = int(len(shop_list))
if shop_name not in range(1, unm1+1): #判断输入商品编号是否在序列中
print('输入有误,请重新输入!')
continue
else:
price = int(shop_list[shop_name - 1][1]) #商品单价
if money < price:
print('您的金额不足,无法购买')
continue
money = money - price # 剩余金额
out = shop_list[shop_name - 1][:] # 购买商品信息
shop_out.append(out[:]) # 加入购物车
all_kaixiao += price #汇总消费
print('您购买的商品是:{}单价:{}元'.format(*out))
print('您还可以消费:{}'.format(money))