Python 测试值是否为数字
我们如何编写一个测试来检查一个值是否是数字,并且在该值不是数字时抛出一个异常?在这种情况下我们需要正则表达式吗Python 测试值是否为数字,python,regex,testing,Python,Regex,Testing,我们如何编写一个测试来检查一个值是否是数字,并且在该值不是数字时抛出一个异常?在这种情况下我们需要正则表达式吗 谢谢。您可以使用数字模块 >>> import numbers >>> isinstance(1, numbers.Number) True >>> isinstance('a', numbers.Number) False 需要注意的是,复数被认为是数字的一部分。数字也是,如果你只想要实数,你可以: >>> i
谢谢。您可以使用数字模块
>>> import numbers
>>> isinstance(1, numbers.Number)
True
>>> isinstance('a', numbers.Number)
False
需要注意的是,复数被认为是数字的一部分。数字也是,如果你只想要实数,你可以:
>>> import numbers
>>> isinstance(1, numbers.Real)
True
>>> isinstance(1j, numbers.Real)
False
如果一个值不是数字,我只会抛出一个异常:
assert isinstance(my_value, numbers.Real)
如果my_值不是实数,它将抛出断言错误。如果“数值”实际上是字符串,那么最简单的方法当然是运行测试转换
e、 g.如果需要浮点值,请转换为浮点值
)
注意:如果您只想引发一个异常,那么您可能不需要包装函数is\u float()
。直接做作业就行了
如果您不一定要引发异常,而只是测试数值性,is\u float()
的更一致实现将捕获错误并返回False
:
def is_float(v):
try:
f=float(v)
except ValueError:
return False
return True
Python3中有三种不同的数字类型(int、float和complex)。注意,boolean是int的一个子类 您可以按以下方式检查它们:
def check_numeric(x):
if not isinstance(x, (int, float, complex)):
raise ValueError('{0} is not numeric'.format(x))
如果参数为数值,则函数不执行任何操作。如果不是,则抛出ValueError
>>> check_numeric(1)
>>> check_numeric(True)
>>> check_numeric(1.5)
>>> check_numeric(10L)
>>> check_numeric(complex(1, 2))
>>> check_numeric('spam')
ValueError: spam is not numeric
不,您不需要,您可以使用
isinstance()
函数测试类型。如果您想要抛出异常,为什么还要麻烦测试呢?@PM2Ring他们只想在值不是数字时抛出异常。@user118967当然,但简单的方法是假设值是数字,如果不是,让Python引发ValueError,如umläute答案的第一个代码块所示。我明白了,@PM2Ring。EAFP是一个有趣的原理。就个人而言,我发现有时我们想要检查并提出一个异常,并给出一个更明确的信息。例如,与类似于“TypeError:unsupported operation type For-:'str'和'int'”的错误消息相比,说“Age必须是一个数字,但收到的是:'ween'”可能是更好的错误消息。前者将帮助用户纠正错误输入,尤其是当他们只是用户而不是查看代码的开发人员时。如果您要编写名为的函数is_float
(驼峰大小写应仅用于类名,而不是函数名),则应捕获异常并返回False。@chepner,thx,将函数名更改为is_float()
;我没有返回False
,因为OP明确要求抛出异常;在任何情况下,我都向答案中添加了您的建议这里使用any()
内置函数可能是个好主意。您可以传递类型的元组,因为的第二个参数和long
不再是python 3中的类型。相应地更新了响应。也适用于decimal.decimal
<代码>导入小数;isinstance(十进制。十进制(1.3),数字。数字)为True
。
>>> check_numeric(1)
>>> check_numeric(True)
>>> check_numeric(1.5)
>>> check_numeric(10L)
>>> check_numeric(complex(1, 2))
>>> check_numeric('spam')
ValueError: spam is not numeric