【问题标题】:Returning an exception after using a loop使用循环后返回异常
【发布时间】:2015-11-04 12:20:10
【问题描述】:
我的函数被传递了一个字典(一个名字和一个分数)和一个名字。然后它比较名称以查看其是否在字典中,如果是,则打印名称和分数。
def display_marks_for(adict,name):
try:
for key in adict:
if name == key:
print(name,"=",adict[key])
except KeyError:
print(name,'not on list')
如果名称在字典中,我的代码会打印正确的内容,但如果名称不存在,则不会打印任何内容?
我想让它说这个名字不在列表中。
谢谢
【问题讨论】:
标签:
python
exception
dictionary
exception-handling
keyerror
【解决方案1】:
您的代码可以简化为以下内容,因为您不需要遍历所有键(这是字典的全部意义 - 避免循环查找内容):
def display_marks_for(adict, name):
mark = adict.get(name)
if mark:
print('{}={}'.format(name, mark))
else:
print('{} is not in the dictionary'.format(name))
字典的get() 方法尝试查找给定键的值,如果它不存在 - 它不会引发 KeyError,而是返回 None。
如果你想练习捕获KeyError,你可以修改你的方法——再次注意你不需要循环:
def display_marks_for(adict, name):
try:
mark = adict[name]
print('{}={}'.format(name, mark))
except KeyError:
print('{} is not in the dictionary'.format(name))
【解决方案2】:
如果您遍历字典中的键,您将不会得到keyError,因为它们都会在那里。如果key 与name 不匹配,您最好使用else 语句
def display_marks_for(adict,name):
if name in adict.keys():
print(name,"=",adict[name])
else:
print(name,'not on list')
或者,如果您确实想使用 KeyError 异常,请不要遍历您的字典键:
def display_marks_for(adict,name):
try:
print(name,"=",adict[name]) #Will Raise KeyError if does not exist
except KeyError:
print(name,'not on list')