Python:如何检查变量是一个有意义的数字类型

2024-04-19 10:12:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,如何检查变量是否为数值类型且具有有意义的值?在

这里我所说的“数字类型”是指那些像intfloat,和{}的所有不同比特长度,并用“有意义的值”表示它不是{}或任何其他不能用于进一步计算的特殊值。在

我想这是一个常见的问题,但我发现了一个重复的问题。如果有副本,请告诉我。)


Tags: 类型副本数字floatint数值意义
3条回答

这取决于你想做得有多彻底。除了内置类型(complexfloat,和int)之外,在python中还有其他类型被认为是数字。例如:^{}^{},甚至bool都可以作为数字。然后得到具有自己数值类型的外部库。到目前为止最大的是^{}。使用numpy时,它的某些类型将成功执行isinstance检查,而其他类型则不会。例如:isinstance(numpy.float64(10), float)为真,但isinstance(numpy.float32(10), float)不是。 除此之外,你甚至可以有一个用户定义的类,它的作用类似于一个数字。在

Python确实提供了一种解决这个问题的方法^{}模块。它提供了几种表示不同类型数字的抽象类型。任何实现数值功能的类都可以注册为与相关类型兼容。numbers.Number是最基本的,因此也是您要寻找的。您只需在isinstance检查中使用它。例如

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也是一个特殊的数,因为它是唯一不等于自身的数。在

这意味着您的最终检查可能看起来像:

^{pr2}$

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。在

编辑:使用numbers.Number在下面的答案上添加,以排除布尔值。在

>>> from math import isnan
>>> isnan(float('nan'))
True
>>> isnan(1j.real)
False
>>> isnan(1j.imag)
False

整数不能是nan。在

相关问题 更多 >