python购物车问题

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))

img

img

完美,没毛病,至少目前我没看出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))