2024-04-19 10:12:13 发布
网友
在python中,如何检查变量是否为数值类型且具有有意义的值?在
这里我所说的“数字类型”是指那些像int,float,和{}的所有不同比特长度,并用“有意义的值”表示它不是{}或任何其他不能用于进一步计算的特殊值。在
int
float
我想这是一个常见的问题,但我发现了一个重复的问题。如果有副本,请告诉我。)
这取决于你想做得有多彻底。除了内置类型(complex,float,和int)之外,在python中还有其他类型被认为是数字。例如:^{},^{},甚至bool都可以作为数字。然后得到具有自己数值类型的外部库。到目前为止最大的是^{}。使用numpy时,它的某些类型将成功执行isinstance检查,而其他类型则不会。例如:isinstance(numpy.float64(10), float)为真,但isinstance(numpy.float32(10), float)不是。 除此之外,你甚至可以有一个用户定义的类,它的作用类似于一个数字。在
complex
bool
numpy
isinstance
isinstance(numpy.float64(10), float)
isinstance(numpy.float32(10), float)
Python确实提供了一种解决这个问题的方法^{}模块。它提供了几种表示不同类型数字的抽象类型。任何实现数值功能的类都可以注册为与相关类型兼容。numbers.Number是最基本的,因此也是您要寻找的。您只需在isinstance检查中使用它。例如
numbers.Number
from numbers import Number from decimal import Decimal from fractions import Fraction import numpy assert isinstance(1, Number) assert isinstance(1.5, Number) assert isinstance(1+5j, Number) assert isinstance(True, Number) assert isinstance(Decimal("1.23"), Number) assert isinstance(Fraction(1, 2), Number) assert isinstance(numpy.float64(10), Number) assert isinstance(numpy.float32(10), Number) assert isinstance(numpy.int32(10), Number) assert isinstance(numpy.uint32(10), Number)
这仍然给我们留下了一个问题,即对象是否真的是一个数字,而不是“不是一个数字”。^{}函数对此很好,但它要求数字可以转换为浮点(不是所有的数字都是这样)。这里最大的问题是complex类型。有几种方法可以解决这个问题:附加的isinstance检查(但是这也有它自己的麻烦)、使用^{}或测试是否相等。在
abs可用于每种数字类型(我能想到)。对于大多数数字,它返回数字的正数,但对于复数,它返回其大小(一个浮点数)。现在我们可以做isnan检查。nan也是一个特殊的数,因为它是唯一不等于自身的数。在
abs
isnan
nan
这意味着您的最终检查可能看起来像:
Python 2.x和3.x
import math import numbers def is_numerical(x): return isinstance(x, numbers.Number) and not isinstance(x, bool) and not math.isnan(abs(n)) and math.isfinite(abs(n))
区别的原因是Python3将long和{}类型合并为int。在
long
编辑:使用numbers.Number在下面的答案上添加,以排除布尔值。在
>>> from math import isnan >>> isnan(float('nan')) True >>> isnan(1j.real) False >>> isnan(1j.imag) False
整数不能是nan。在
这取决于你想做得有多彻底。除了内置类型(} ,^{} ,甚至} 。使用
complex
,float
,和int
)之外,在python中还有其他类型被认为是数字。例如:^{bool
都可以作为数字。然后得到具有自己数值类型的外部库。到目前为止最大的是^{numpy
时,它的某些类型将成功执行isinstance
检查,而其他类型则不会。例如:isinstance(numpy.float64(10), float)
为真,但isinstance(numpy.float32(10), float)
不是。 除此之外,你甚至可以有一个用户定义的类,它的作用类似于一个数字。在Python确实提供了一种解决这个问题的方法^{} 模块。它提供了几种表示不同类型数字的抽象类型。任何实现数值功能的类都可以注册为与相关类型兼容。
numbers.Number
是最基本的,因此也是您要寻找的。您只需在isinstance
检查中使用它。例如这仍然给我们留下了一个问题,即对象是否真的是一个数字,而不是“不是一个数字”。^{} 函数对此很好,但它要求数字可以转换为浮点(不是所有的数字都是这样)。这里最大的问题是} 或测试是否相等。在
complex
类型。有几种方法可以解决这个问题:附加的isinstance
检查(但是这也有它自己的麻烦)、使用^{abs
可用于每种数字类型(我能想到)。对于大多数数字,它返回数字的正数,但对于复数,它返回其大小(一个浮点数)。现在我们可以做isnan
检查。nan
也是一个特殊的数,因为它是唯一不等于自身的数。在这意味着您的最终检查可能看起来像:
^{pr2}$Python 2.x和3.x
区别的原因是Python3将}类型合并为
long
和{int
。在编辑:使用
numbers.Number
在下面的答案上添加,以排除布尔值。在整数不能是nan。在
相关问题 更多 >
编程相关推荐