题目求助。关于局部变量赋值前被引用
本帖最后由 雷锤 于 2022-11-24 17:36 编辑题目内容:
编写程序制作英文词典的维护程序,基本功能包括:添加(修改)、删除和查询。程序中使用字典对象保存数据,其中每一个元素表示一条字典条目,英文单词为元素的键,中文释义为元素的值。程序会根据用户的输入运行相应的功能,并显示相应的运行结果,直到用户输入quit结束程序,具体输入格式如下:
①添加(修改)条目的输入格式为:update 英文单词 中文释义,操作成功返回True,否则返回False。
②删除条目的输入格式为:delete 英文单词,操作成功返回True,否则返回False。
③查询条目的输入格式为:search 英文单词,返回值为对应的中文释义,当查询的单词不存在时,显示“Not Found”。
④退出程序的输入格式为:quit。
⑤如果输入内容不符合以上格式,则提示用户“Error Input”。
输入样例:
update apple 苹果
update banana 香蕉
update peach 桃子
search apple
search banana
search peach
delete peach
search peach
quit
输出样例:
True
True
True
苹果
香蕉
桃子
True
Not Found
————————
上面是题目
我的代码如下
class app():
def __init__(self):
self.base={}
def in_1(self):
a=input()
if a=='quit':
pass
s=list(a.split(' '))
if len(s)<2 or len(s)>3:
if s=='quit' and len(s)==1:
pass
else:
print('Error Input')
self.in_1()
elif len(s)==2:
if sin ['search','delete']:
a1=s
a2=s
else:
print('Error Input')
self.in_1()
elif len(s)==3:
if s in ['update']:
a1=s
a2=s
a3=s
else:
print('Error Input')
self.in_1()
if a1=='update':
self.update_1(a2,a3)
del a1
self.in_1()
elif a1=='delete':
self.delete_1(a2)
del a1
self.in_1()
elif a1=='search':
self.search_1(a2)
del a1
self.in_1()
else:
del a1
self.in_1()
def update_1(self,a2,a3):
self.base=a3
print('True')
def delete_1(self,a2):
try:
del self.base
print('True')
except:
print('False')
def search_1(self,a2):
if (a2 in self.base):
print(self.base)
else:
print('False')
if __name__=='__main__':
a=app()
a.in_1()
报错原因:UnboundLocalError: local variable 'a1' referenced before assignment,
——————
问题:在进行过update search 后 输入quit 反而会报错,并且之前为什么 输入第二次search的时候不会
本帖最后由 jackz007 于 2022-11-23 13:01 编辑
def in_1(self):
a = input()
if a == 'quit':
pass
s = list(a . split(' '))
if len(s) < 2 or len(s) > 3 :
if s == 'quit' and len(s) == 1: # 此分支没有为 a1 赋值
pass # 在这里让 a1 = 'quit' 如何?
else:
print('Error Input')
self.in_1()
elif len(s)==2:
if sin ['search','delete']:
a1=s # a1 属于条件赋值
a2=s
else:
print('Error Input')
self.in_1()
elif len(s)==3:
if s in ['update']:
a1=s # a1 属于条件赋值
a2=s
a3=s
else:
print('Error Input')
self.in_1()
if a1=='update': # 在主干通道判断一个属于条件赋值的变量,风险来自这里!!! 为什么要写一个类呢,直接一个字典不香吗,楼主是在做题还是在做软件啊 还是菜鸡阶段,看不懂{:10_266:} 看看 学习~ 看看 本帖最后由 阿奇_o 于 2022-11-23 18:02 编辑
题目的意思应该是: 先 所有命令输入完,quit后,再批量处理和输出结果吧,不是单独的输入一条命令就输出一条结果。。
我是这样理解和这样写的:
class App:
words = dict(apple='苹果', banana='香蕉') # 初始化,作为测试设包含这两个单词
def manage_words(self):
self.cmds = [] # 收集所有命令操作
while True:
self.cmds.append(input().strip())
# print(self.cmds) # 查看每次(每行)输入命令后, 命令清单
if self.cmds[-1] == 'quit':
self.show() #
self.cmds.clear()
break
def show(self):
for cmd in self.cmds[:-1]:# 不要最后一条quit命令(上面已经判断处理了)
stmt = cmd.split()
if len(stmt) == 3 and stmt == 'update':
c, word, zh = stmt
try:
self.words = zh
print(True, '--Update Successfully')# 更新成功
except:
print(False, '--更新失败?') # 失败?这会发生吗?
elif len(stmt) == 2 :
c, word = stmt
if c == 'delete':
try:
self.words.pop(word)
print(True, f'--已删除{word}')
except:
print(False, '--删除失败(该单词未收录在当前字典里)')
if c == 'search' :
print(self.words.get(word, 'Not Found')) # 用dict.get 省去类似上面try的判断 (补充,查了一下:dict.pop 其实也可以这样 ^_)
else:
print('Error Input')
app = App()
app.manage_words() 学习~ 学习~
学习 新手表示看不懂hhhhhh还没学那么多 zhangjinxuan 发表于 2022-11-23 14:35
为什么要写一个类呢,直接一个字典不香吗,楼主是在做题还是在做软件啊
我单纯想试试{:10_285:} jackz007 发表于 2022-11-23 12:54
带佬,能不能细说一下,我看不懂{:10_254:},为什么主干通道判断一个属于条件赋值的变量会有风险 雷锤 发表于 2022-11-24 17:12
我单纯想试试
azhe 本帖最后由 jackz007 于 2022-11-24 17:26 编辑
雷锤 发表于 2022-11-24 17:20
带佬,能不能细说一下,我看不懂,为什么主干通道判断一个属于条件赋值的变量会有风险
条件赋值,那就有可能没有被赋值,一旦真的没有被赋值,判断语句又在主干(必执行)通道上,是一定会判断它的值的,这不就出问题了? jackz007 发表于 2022-11-24 17:25
条件赋值,那就有可能没有被赋值,一旦真的没有被赋值,判断语句又在主干(必执行)通道上, ...
好的 感谢 jackz007 发表于 2022-11-23 12:54
没法运行啊,你的第二个else好像出了问题 编程追风梦 发表于 2022-11-24 19:04
没法运行啊,你的第二个else好像出了问题
我们没有写代码,代码是楼主的。 jackz007 发表于 2022-11-24 19:11
我们没有写代码,代码是楼主的。
哦....
页:
[1]