我正在手动尝试异常以完全理解它们,并且我创建了如下代码:
def misterio(a,b):
if type(a) or type(b) != ("int") and ("float"):
raise TypeError ("Arguments should be numbers" .format(a,b))
else:
if (b<0):
raise ValueError ("B cant be 0")
elif (b==1):
return a
else:
return a+misterio(a,b-1)
print(misterio(3,2))
print(misterio(3,"a"))
print(misterio(3,1))
但是它没有通过第一个if
。我要做的就是检查我的参数是否为数字(我知道b
应该至少大于1,但我正在逐步进行操作)。有没有办法以最pythonic的方式做到这一点?原因即使我俩都是if
,我仍然不明白为什么它没有超过第一个int
。
答案 0 :(得分:1)
你想要
def misterio(a, b):
if not all(isinstance(x, (int, float)) for x in [a, b]):
raise TypeError("Arguments should be numbers.")
else:
if (b < 0):
raise ValueError("B cant be 0")
elif (b == 1):
return a
else:
return a + misterio(a, b - 1)
print(misterio(3, 2))
print(misterio(3, "a"))
print(misterio(3, 1))
首先,使用isinstance(...)
代替type(...)
,然后使用第二个:
if type(a) or ...
即使a
为None
,也始终返回true:
a = None
if type(a) or None:
print("Yes")
与您的实际错误无关,但是您没有在错误消息中使用a
或b
,因此我将其省略。
答案 1 :(得分:-2)
我也发现这也可行。我不知道为什么我在发布问题后总是会在几分钟内找到解决方案。谢谢大家!
def misterio(a,b):
if type(a) is not (int or float) or type(b) is not (int or float):
raise TypeError ("Arguments should be numbers" .format(a,b))
else:
if (b<0):
raise ValueError ("B cant be 0")
elif (b==1):
return a
else:
return a+misterio(a,b-1)
print(misterio(3,2))
print(misterio(-2, 2))
print(misterio('bruh', 2))