Python-使用isalpha在int上无值错误
为什么这次尝试没有引发ValueError/除非isalpha失败 我知道如果给定一个数字,isalpha返回falsePython-使用isalpha在int上无值错误,python,python-3.x,Python,Python 3.x,为什么这次尝试没有引发ValueError/除非isalpha失败 我知道如果给定一个数字,isalpha返回false In [9]: ans = input("Enter a Letter") Enter a Letter4 In [10]: ans.isalpha() Out[10]: False 如果他们提供的是数字而不是y或n,如何获得值错误?因为如果尝试是错误的,它不应该停止是真的,而不打印我的轨迹吗 import sys v0 = float(input("What velo
In [9]: ans = input("Enter a Letter")
Enter a Letter4
In [10]: ans.isalpha()
Out[10]: False
如果他们提供的是数字而不是y或n,如何获得值错误?因为如果尝试是错误的,它不应该停止是真的,而不打印我的轨迹吗
import sys
v0 = float(input("What velocity would you like? "))
g = float(input("What gravity would you like? "))
t = float(input("What time decimal would you like? "))
print("""
We have the following inputs.
v0 is %d
g is %d
t is %d
Is this correct? [Y/n]
""" % (v0, g, t))
while True:
try:
answer = input("\t >> ").isalpha()
print(v0 * t - 0.5 * g * t ** 2)
except ValueError as err:
print("Not a valid entry", err.answer)
sys.exit()
finally:
print("would you like another?")
break
例如,如果用户键入5而不是y或n,仍然会得到答案
$ python3 ball.py
What velocity would you like? 2
What gravity would you like? 3
What time decimal would you like? 4
We have the following inputs.
v0 is 2
g is 3
t is 4
Is this correct? [Y/n]
>> 5
-16.0
would you like another?
您需要自己提出错误。键入您不喜欢的内容不会引发任何异常:
try:
answer = input("\t >> ").isalpha()
if not answer:
raise ValueError
print(v0 * t - 0.5 * g * t ** 2)
except ValueError as err:
print("Not a valid entry", err.answer)
sys.exit()
除了ValueError as err:仅在抛出ValueError时发生。answer的值为False,但这只是一个任意布尔值,不是错误
有关错误的示例,请参见
在您的情况下,只需测试:
answer = input("\t >> ")
if answer.isalpha():
print(v0 * t - 0.5 * g * t ** 2)
break
一般来说,您应该更喜欢使用普通的控制流逻辑来处理一系列用户输入,而不是引发/捕获异常。为了清晰起见,发布了一个答案,试图提供一种更一致和明确的方法来处理字符串和int。通过使用isinstance,我向一个明确阅读我的代码的人声明,我的值有望提高可读性
answer = input("\t >> ")
if isinstance(int(answer), int) is True:
raise ValueError("Ints aren't valid input")
sys.exit()
elif isinstance(answer, str) is True:
print(v0 * t - 0.5 * g * t ** 2)
else:
print("Ok please ammend your entries")
如果我以后有不同的需求,这可以很容易地抽象成一个函数,因为iInstance允许检查多种类型,这增加了灵活性
参考文献
正如您已经说过的,isalpha返回True | False。为什么您希望它会引发ValueError?@SiHa从几个SO示例中得出答案,例如,如果int为false,它将引发ValueError。我想反过来会是真的,但那完全不同。在这种情况下,他们试图将非数字字符串转换为int,这会引发异常,因为这是不可能的。调用“4”。isalpha将返回False,但不会引发异常,因为没有发生异常-函数调用成功。我建议你在try上多读一点,除了要完全理解这个概念。但你并不是想把int转换成字符串,而是调用一个库函数来告诉你它是否是字母表中的一个字母。如下所述,使用异常来控制程序流通常是个坏主意。您的isalpha调用中有一个布尔值,在if语句中使用它,在这里忘记异常。另外,如果您确实尝试将int转换为字符串,那么无论如何也不会引发异常-“4”是一个完全有效的字符串:@SiHa谢谢,这个示例是根据我之前解决的一个问题设计的,我只是为了使用和学习try,但我认为用户在需要字符串时输入int是一个很好的用例。你认为这个错误答案有什么用?我还没有深入研究过。它不会打印出发帖前搜索到的答案的值,对于是否应该使用条件逻辑而不是try/except,它的观点似乎是混合的。在这种情况下,对我来说,仅仅使用try是一个人为的问题,除非用户没有输入Y或Y,否则我放弃了,只是试图在不是字母的情况下得到一个错误显式优于隐式。建议条件逻辑应该优先于try/except。你能在讨论这一点的地方发布几个链接吗?这里有一个问题我在发布中关闭了几个标签,然而,一个答案有63个表示try-except,另一个61个表示conditional,请特别注意一些注释,这些注释指示使用try-except作为首选项。带有63的答案是从外部函数捕获异常,而不是从局部变量的求值捕获异常。根据有效的Python,抛出异常的函数实际上比不返回异常的函数更可取,以表示特殊的含义。但这种情况与评估variable@sayth在你提到的情况下,我赞成例外。simulate函数在正常异常中返回一个布尔值,而except捕获意外故障。打印部分工作正常,似乎无法将int转换为字符串以表示故障,ValueError是我的撤消操作。在测试isalpha时,我只收到布尔值。你能给出一个例子,当用户输入一个数字时,v、g和t的值,以及打印的内容吗?例如,语句print3*'4'-0.5*5*'4'**2引发了一个TypeError。我在更新的问题中遇到了它,因为int为2 3 4,返回-16.0OK,这是我误解的。我以为它指的是用户输入。
def testSomething(arg1, **types):
if isintance(arg1, [types]):
do_something