所以我已经定义了一个名为change(a,d)
的函数来计算给定面额d的数量变化。我还有一些参数:a必须是int类型,d必须是int类型列表,d的元素必须按升序排列,否则引发ChangeParameterError。我的代码如下:
class ChangeRemainderError(Exception):
pass
class ChangeParameterError(Exception):
pass
def change(a, d):
if type(a) != int:
raise ChangeParameterError
if type(d) != type(list):
raise ChangeParameterError
if type(d) != d.sort():
raise ChangeParameterError
i, r, c = len(d)-1, a, len(d)*[0]
while i >= 0:
c[i], r = divmod(r, d[i])
i = i-1
return c
def printChange(a, d):
try:
print(change(a, d))
except ChangeParameterError:
print('needs an integer amount and a non-empty list \
of denominations in ascending order')
except ChangeRemainderError:
print('no exact change possible')
except:
print('unexpected error')
并且因为它正在为测试抛出ChangeParameterError它不应该这样做。例如:
change(3, [3, 7]) == [1, 0]
返回ChangeParameterError,即使a是int,d是按升序排列的列表。并且错误消息并非真正有用。错误消息如下:
<ipython-input-39-62477b9defff> in change(a, d)
19 raise ChangeParameterError
20 if type(d) != type(list):
---> 21 raise ChangeParameterError
22 if type(d) != d.sort():
23 raise ChangeParameterError
ChangeParameterError:
感谢任何帮助,谢谢!
答案 0 :(得分:1)
您可以看到两个逻辑错误。试试这个:
def change(a, d):
if type(a) != int:
raise ChangeParameterError
if type(d) != list: # 1
raise ChangeParameterError
if d != sorted(d): # 2
raise ChangeParameterError
首先,type(list)
将返回<type>
类型。
其次,您在第三张检查中包含type(d)
,但它没有意义。此外,d.sort()
不会返回任何内容;它对列表进行了排序。
此外,最好使用isinstance
而不是检查type
的返回值。