报错内容Traceback (most recent call last):
File "C:/Users/heliun/PycharmProjects/pythonProject/14.py", line 117, in
supermarket.mainmenu()
File "C:/Users/heliun/PycharmProjects/pythonProject/14.py", line 86, in mainmenu
goods = Goods(id, name, price, num,allprice)
UnboundLocalError: local variable 'allprice' referenced before assignment
具体代码:class Goods:
def init(self,id,name,price,num):
self.id=id
self.name=name
self.price=price
self.num=num
class MySuperMarket:
def init(self,id,name):
self.id=id
self.name=name
self.allingoods=[]
self.alloutgoods=[]
self.allinvent={}
def ingoods(self, goods):
dict = {}
dict[goods.id] = goods
self.allingoods.append(dict)
if goods.id in self.allinvent.keys():
object = self.allinvent[goods.id]
object.price = (object.price * object.num + goods.price * goods.num) / (object.num + goods.num)
object.num = object.num + goods.num
self.allinvent[object.id] =object
return 1
inventgoods=Goods(goods.id,goods.name,goods.price,goods.num)
self.allinvent[inventgoods.id] = inventgoods
def outgoods(self,goods):
dict={}
dict[goods.id]=goods
self.alloutgoods.append(dict)
if goods.id in self.allinvent.keys():
if goods.num<=object.num:
object.num=object.num-goods.num
self.allinvent[object.id]=object
else :
print("库存数量不足!清重新输入")
goods.num=int(input("请重新输入商品的数量:"))
object.num = object.num - goods.num
def allinventlook(self,goods):
if goods.id in self.allinvent.keys():
self.allinvent[object.id] = object
def outlook(self,goods):
if goods.id in self.allinvent.keys():
self.allinvent[object.id] = object
def inlook(self, goods):
if goods.id in self.allinvent.keys():
self.allinvent[object.id] = object
def mainmenu(self):
while True:
print("*"*8+self.name+"*"*8)
print("1. 购进 2. 销售")
print("3. 查询 0. 退出")
print("*"*22)
sele=int(input("请输入您的选择(0:退出):"))
if sele==0:
for k in self.allingoods:
for v in k.values():
print(v.name,v.price,v.num)
for v in self.allinvent.values():
print(v.name,v.price,v.num,sep=" ")
print("谢谢使用...")
return 1
elif sele==1:
id=input("请输入购进的商品ID:")
name=input("请输入购进的商品名称:")
price=float(input("请输入商品单价:"))
num=float(input("请输入商品数量:"))
goods = Goods(id,name, price,num)
self.ingoods(goods)
elif sele==2:
id=input("请输入销售商品的ID:")
name=input("请输入销售商品的名称:")
num= int(input("请输入销售商品的数量:"))
price= int(input("请输入销售商品的单价:"))
for a in self.alloutgoods:
for b in i.values():
if b.id == id:
allprice = b.price * b.num
goods = Goods(id, name, price, num,allprice)
self.outgoods(goods)
elif sele==3:
print("*" * 8 + "查找类型" + "*" * 8)
print("A. 查找库存商品 B.查找销售商品 C.查找进货商品")
print("*" * 22)
choose =input("请输入您的选择(#:退出):")
id = input("请输入需要查询的库存商品的ID:")
if choose=="A":
goods = Goods(id, name, price, num, allprice)
for c in self.allinvent:
for d in d.values():
print("名称:d.name"+"单价:d.price"+"数量:d.num")
elif choose == "B":
goods = Goods(id, name, price, num, allprice)
for e in self.allinvent:
for f in b.values():
print("名称:f.name" + "单价:f.price" + "数量:f.num"+"总价:f.allprice")
elif choose == "C":
goods = Goods(id, name, price, num)
for c in self.allinvent:
for d in d.values():
print("名称:d.name" + "单价:d.price" + "数量:d.num")
#主模块
supermarket=MySuperMarket("001","道奇超市")
supermarket.mainmenu()
首先说一下报错原因,出现local variable 'xxx' referenced before assignment
出现错误,一般会有两个原因:
情况一:变量没有被赋值直接引用了
def hello():
print(a) # 没有给a赋值,不知道a是什么
情况二:函数引用全局变量的时候没有声明
在函数内,既包含对全局变量的引用,又包含对其的赋值,且赋值放在了引用之后,就会报错。
money = 1000
def work(m):
# 引用
h = money + m
print("h的值为:" + str(h))
# 赋值
money = h
print("内部money的值:" + str(money))
work(200)
项目报错的原因是情况一。你在elseif
语句中对变量进行赋值,只有选择了该分支,才会出现变量被赋值的情况;如果没有选择该赋值,则变量没有被赋值,这样直接引用自然会报错了。例如
# 当走分支 elif sele == 1 和 elif sele == 2时,id, name, num等变量都被赋值了,你使用下面的语句自然不会报错:
goods = Goods(id, name, price, num) # 引用
# 当走分支 elif sele == 3时,没有对name, price, num, allprice等变量赋值, 这时候,如果直接走分支 if choose == "A" 就会立马报错了。
# class,使用单数概念
class Good:
# allprice 默认参数,只有出售商品列表需要用到该属性
def __init__(self, id, name, price, num, allprice=0.0):
self.id = id
self.name = name
self.price = price
self.num = num
self.allprice = allprice
class MySuperMarket:
def __init__(self, id, name):
self.id = id
self.name = name
self.allingoods = [] # list类型
self.alloutgoods = [] # list 类型
self.allinvent = {} # dict类型
# 进货
def ingoods(self, good):
# 添加商品到进货列表
# 深拷贝,避免后续修改影响记录
mgood = Good(good.id, good.name, good.price, good.num)
self.allingoods.append(mgood)
# 如果进货的商品有库存,修改库存信息
if good.id in self.allinvent.keys():
obj = self.allinvent[good.id]
obj.price = (obj.price * obj.num + good.price * good.num) / (obj.num + good.num)
obj.num = obj.num + good.num
self.allinvent[obj.id] = obj
return 1
# 如果进货的商品无库存,直接添加到库存
self.allinvent[good.id] = good
# 销售
def outgoods(self, good):
# 出售商品,则添加商品到出售列表
# 深拷贝,避免后续修改影响记录
mgood = Good(good.id, good.name, good.price, good.num, good.allprice)
self.alloutgoods.append(mgood)
# 如果进货的商品有库存,且数量足够,则出售
# 如果进货商品库存不足,则输出错误信息
if good.id in self.allinvent.keys():
obj = self.allinvent[good.id]
if good.num <= obj.num:
obj.num = obj.num - good.num
self.allinvent[obj.id] = obj
else:
print("库存数量不足!清重新输入")
good.num = int(input("请重新输入商品的数量:"))
obj.num = obj.num - good.num
# 查找库存商品信息
def allinventlook(self, goods):
if goods.id in self.allinvent.keys():
obj = self.allinvent[goods.id]
print("名称:%s, 单价:%.2f, 数量:%d" % (obj.name, obj.price, obj.num))
return
print("查找的商品无库存")
# 查找销售记录
# 同一类商品可能存在多条销售记录,所以添加换行
def outlook(self, good):
# 增加一个变量,记录是否查找到记录
isfound = False
for obj in self.alloutgoods:
if good.id == obj.id:
print("名称:%s, 单价:%.2f, 数量:%d 总价:%.2f"
% (obj.name, obj.price, obj.num, obj.allprice))
# 找到记录,赋值为True
isfound = True
# 没有找到记录,则输出提示信息
if not isfound:
print("查找的商品无出售记录")
# 查找进货记录
# 同一类商品可能存在多条进货记录,所以添加换行
def inlook(self, good):
# 增加一个变量,记录是否查找到记录
isfound = False
for obj in self.allingoods:
if obj.id == good.id:
print("名称:%s, 单价:%.2f, 数量:%d" % (obj.name, obj.price, obj.num))
# 找到记录,赋值为True
isfound = True
if not isfound:
print("查找的商品无进货记录")
def mainmenu(self):
global allprice
while True:
print("*" * 8 + self.name + "*" * 8)
print("1. 购进 2. 销售")
print("3. 查询 0. 退出")
print("*" * 22)
sele = int(input("请输入您的选择(0:退出):"))
if sele == 0:
for v in self.allingoods:
print(v.name, v.price, v.num)
for v in self.allinvent.values():
print(v.name, v.price, v.num, sep=" ")
print("谢谢使用...")
return 1
# 进货
elif sele == 1:
id = input("请输入购进的商品ID:")
name = input("请输入购进的商品名称:")
price = float(input("请输入商品单价:"))
num = int(input("请输入商品数量:"))
goods = Good(id, name, price, num)
self.ingoods(goods)
# 销售
elif sele == 2:
id = input("请输入销售商品的ID:")
name = input("请输入销售商品的名称:")
num = int(input("请输入销售商品的数量:"))
price = float(input("请输入销售商品的单价:"))
allprice = 0
# 根据仓库的数据,计算总成本
for e in self.allinvent:
if e.id == id:
allprice = e.price * e.num
goods = Good(id, name, price, num, allprice)
self.outgoods(goods)
# 擦找
elif sele == 3:
print("*" * 8 + "查找类型" + "*" * 8)
print("A. 查找库存商品 B.查找销售商品 C.查找进货商品")
print("*" * 22)
choose = input("请输入您的选择(#:退出):")
id = input("请输入需要查询的库存商品的ID:")
if choose == "A":
goods = Good(id, "", 0, 0)
self.allinventlook(goods)
elif choose == "B":
goods = Good(id, "", 0, 0, 0)
self.outlook(goods)
elif choose == "C":
goods = Good(id, "", 0, 0)
self.inlook(goods)
# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
supermarket = MySuperMarket("001", "道奇超市")
supermarket.mainmenu()
# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
注释比较全了,如果有看不懂的,请提问。
有用,请点个采纳吧
你题目的解答代码如下:
class Goods:
def __init__(self,id,name,price,num):
self.id=id
self.name=name
self.price=price
self.num=num
class MySuperMarket:
def __init__(self,id,name):
self.id=id
self.name=name
self.allingoods=[]
self.alloutgoods=[]
self.allinvent={}
def ingoods(self, goods):
dict = {}
dict[goods.id] = goods
self.allingoods.append(dict)
if goods.id in self.allinvent.keys():
object = self.allinvent[goods.id]
object.price = (object.price * object.num + goods.price * goods.num) / (object.num + goods.num)
object.num = object.num + goods.num
self.allinvent[object.id] =object
return 1
inventgoods=Goods(goods.id,goods.name,goods.price,goods.num)
self.allinvent[inventgoods.id] = inventgoods
def outgoods(self,goods):
if goods.id in self.allinvent.keys():
dict={}
dict[goods.id]=goods
self.alloutgoods.append(dict)
object = self.allinvent[goods.id]
while True:
if goods.num<=object.num:
object.num=object.num-goods.num
self.allinvent[object.id]=object
break
else:
print("库存数量不足!清重新输入")
goods.num=int(input("请重新输入商品的数量:"))
else:
print("没有找到商品的ID")
# def allinventlook(self,goods):
# if goods.id in self.allinvent.keys():
# self.allinvent[object.id] = object
# def outlook(self,goods):
# if goods.id in self.allinvent.keys():
# self.allinvent[object.id] = object
# def inlook(self, goods):
# if goods.id in self.allinvent.keys():
# self.allinvent[object.id] = object
def mainmenu(self):
while True:
print("*"*8+self.name+"*"*8)
print("1. 购进 2. 销售")
print("3. 查询 0. 退出")
print("*"*22)
sele=int(input("请输入您的选择(0:退出):"))
if sele==0:
for k in self.allingoods:
for v in k.values():
print(v.name,v.price,v.num)
for v in self.allinvent.values():
print(v.name,v.price,v.num,sep=" ")
print("谢谢使用...")
return 1
elif sele==1:
id=input("请输入购进的商品ID:")
name=input("请输入购进的商品名称:")
price=float(input("请输入商品单价:"))
num=float(input("请输入商品数量:"))
goods = Goods(id,name, price,num)
self.ingoods(goods)
elif sele==2:
id=input("请输入销售商品的ID:")
name=input("请输入销售商品的名称:")
num= int(input("请输入销售商品的数量:"))
price= int(input("请输入销售商品的单价:"))
# for a in self.alloutgoods:
# for b in a.values():
# if b.id == id:
# allprice = b.price * b.num
goods = Goods(id, name, price, num)
self.outgoods(goods)
elif sele==3:
print("*" * 8 + "查找类型" + "*" * 8)
print("A. 查找库存商品 B.查找销售商品 C.查找进货商品")
print("*" * 22)
choose =input("请输入您的选择(#:退出):").upper()
id = input("请输入需要查询的库存商品的ID:")
if choose=="A":
if id in self.allinvent:
d = self.allinvent[id]
print(f"名称:{d.name} 单价:{d.price} 数量:{d.num}")
else:
print("没有找到商品的ID")
elif choose == "B":
allprice = 0
count = 0
for c in self.alloutgoods:
for d in c.values():
if id == d.id:
print(f"名称:{d.name} 单价:{d.price} 数量:{d.num}")
allprice += d.price*d.num
count += 1
if count>0:
print(f"总价:{allprice}")
else:
print("没有找到商品的ID")
elif choose == "C":
allprice = 0
count = 0
for c in self.allingoods:
for d in c.values():
if id == d.id:
print(f"名称:{d.name} 单价:{d.price} 数量:{d.num}")
allprice += d.price*d.num
count += 1
if count>0:
print(f"总价:{allprice}")
else:
print("没有找到商品的ID")
#主模块
supermarket=MySuperMarket("001","道奇超市")
supermarket.mainmenu()
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
这个题貌似做过,不知道是不是跟你的需求一致,注释部分有功能描述,你可以参考一下,如果需求一致可以直接用,测试数据也提供了,如果有差别,请无视
'''
1.进货管理:通过收银员输入商品ID、名称、进货价格、数量实现进货与库存变化管理。
2.销售管理:通过收银员输入商品ID、名称、销售价格、数量实现销售与库存变化管理。
3.库存管理:
(1)打印库存明细表
(2)根据商品ID,输出该商品库存详细信息
4.统计查询:
(1)根据进货商品ID,输出所有该商品进货详细信息
(2)根据销售商品ID,输出所有该商品销售详细信息
(3)打印销售明细,并统计销售总金额
'''
class Goods:
def __init__(self,id,name,price,num):
self.id=id
self.name=name
self.price=price
self.num=num
class MySuperMarket:
def __init__(self,name):
self.name=name
self.all_store = {}
self.all_in_goods={}
self.all_out_goods={}
def in_goods(self, good):
id = good.id
if id in self.all_store.keys():
self.all_store[id].num += good.num
else:
self.all_store[id] = good
if id in self.all_in_goods.keys():
self.all_in_goods[id].append({'id':good.id,'name':good.name,'price':good.price,'num':good.num})
else:
self.all_in_goods[id] = [{'id':good.id,'name':good.name,'price':good.price,'num':good.num}]
def out_goods(self, lst):
for good in lst:
self.all_store[good.id].num -= good.num
if id in self.all_out_goods.keys():
self.all_out_goods[good.id].append({'id':good.id,'name':good.name,'price':good.price,'num':good.num})
else:
self.all_out_goods[good.id] = [{'id':good.id,'name':good.name,'price':good.price,'num':good.num}]
def show_store(self):
print("="*8+'打印库存明细表'+"="*8)
for v in self.all_store.values():
if v.num>0:
print(f'ID:{v.id}, 名称:{v.name} 进货价格:{v.price}, 数量:{v.num}')
def show_store_by_id(self,id):
print("="*8+'打印商品'+id+'的库存详细信息'+"="*8)
if id in self.all_store.keys():
v = self.all_store[id]
print(f'ID:{v.id}, 名称:{v.name} 进货价格:{v.price}, 数量:{v.num}')
def show_in_goods_by_id(self, id):
print("="*8+'打印商品'+id+'的进货详细信息'+"="*8)
if id in self.all_in_goods.keys():
lst = self.all_in_goods[id]
for v in lst:
print(f'ID:{v["id"]}, 名称:{v["name"]} 进货价格:{v["price"]}, 数量:{v["num"]}')
def show_out_goods_by_id(self, id):
print("="*8+'打印商品'+id+'的销售详细信息'+"="*8)
if id in self.all_out_goods.keys():
lst = self.all_out_goods[id]
for v in lst:
print(f'ID:{v["id"]}, 名称:{v["name"]} 销售价格:{v["price"]}, 数量:{v["num"]}')
def show_out_goods(self,lst):
print("="*8+'打印销售明细,并统计销售总金额'+"="*8)
sum = 0
for v in lst:
print(f'ID:{v.id}, 名称:{v.name} 销售价格:{v.price}, 数量:{v.num}')
sum+=v.price*v.num
print(f'订单总价:{sum}')
def mainmenu(self):
print("*"*8+self.name+"*"*8)
while True:
print('*'*22)
print("1. 购进 2. 销售")
print("3. 查询 0. 退出")
print("*"*22)
select=int(input("请输入您的选择(0:退出):"))
if select==0:
print("谢谢使用...")
break
elif select==1:
[id,name,price,num] = input("请输入进货信息(id,name,price,num):").split(',')
goods = Goods(id,name,float(price),int(num))
self.in_goods(goods)
elif select==2:
lst = []
while True:
info = input("请输入销售信息(id,name,price,num),输入#结束:")
if info=='#':
break
else:
[id,name,price,num] = info.split(',')
if id in self.all_store.keys():
if self.all_store[id].num>=int(num):
good = Goods(id,name,float(price),int(num))
lst.append(good)
else:
print('库存不足')
else:
print('这个商品没有库存')
self.out_goods(lst)
self.show_out_goods(lst)
elif select==3:
print("1. 打印库存明细表")
print("2. 根据商品ID,输出该商品库存详细信息")
print("3. 根据商品ID,输出所有该商品进货详细信息")
print("4. 根据商品ID,输出所有该商品销售详细信息")
s1 = input('请输入选择:')
if s1=='1':
self.show_store()
else:
id = input('请输入商品ID:')
if s1=='2':
self.show_store_by_id(id)
elif s1=='3':
self.show_in_goods_by_id(id)
elif s1=='4':
self.show_out_goods_by_id(id)
if __name__=='__main__':
mm = MySuperMarket('道奇超市')
mm.mainmenu()
测试数据:
1
1,啤酒,10,100
1
2,花生,1,100
2
1,啤酒,20,10
2,花生,1.5,10
#
3
1
3
2
1
3
3
1
3
4
1
0
运行数据:
道奇超市
购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):1
请输入进货信息(id,name,price,num):1,啤酒,10,100
购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):1
请输入进货信息(id,name,price,num):2,花生,1,100
购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):2
请输入销售信息(id,name,price,num),输入#结束:1,啤酒,20,10
请输入销售信息(id,name,price,num),输入#结束:2,花生,1.5,10
请输入销售信息(id,name,price,num),输入#结束:#
========打印销售明细,并统计销售总金额========
ID:1, 名称:啤酒 销售价格:20.0, 数量:10
ID:2, 名称:花生 销售价格:1.5, 数量:10
订单总价:215.0
购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):3
打印库存明细表
根据商品ID,输出该商品库存详细信息
根据商品ID,输出所有该商品进货详细信息
根据商品ID,输出所有该商品销售详细信息
请输入选择:1
========打印库存明细表========
ID:1, 名称:啤酒 进货价格:10.0, 数量:90
ID:2, 名称:花生 进货价格:1.0, 数量:90
根据商品ID,输出该商品库存详细信息
根据商品ID,输出所有该商品进货详细信息
根据商品ID,输出所有该商品销售详细信息
请输入选择:3
请输入商品ID:1
========打印商品1的进货详细信息========
ID:1, 名称:啤酒 进货价格:10.0, 数量:100
购进 2. 销售
查询 0. 退出
请输入您的选择(0:退出):3
打印库存明细表
根据商品ID,输出该商品库存详细信息
根据商品ID,输出所有该商品进货详细信息
根据商品ID,输出所有该商品销售详细信息
请输入选择:4
请输入商品ID:1
========打印商品1的销售详细信息========
ID:1, 名称:啤酒 销售价格:20.0, 数量:10
购进 2. 销售
查询 0. 退出