如何检查我的Python对象是否为数字?

285 投票
5 回答
354091 浏览
提问于 2025-04-16 07:06

在Java中,所有的数字类型都是从Number这个类派生出来的,所以我会使用

(x instanceof Number).

那在Python中对应的是什么呢?

5 个回答

63

使用来自 numbers 模块的 Number 来测试 isinstance(n, Number)(从 2.6 版本开始就可以用了)。

isinstance(n, numbers.Number)

下面是一些不同类型的数字和一个非数字的示例:

>>> from numbers import Number
... from decimal import Decimal
... from fractions import Fraction
... for n in [2, 2.0, Decimal('2.0'), complex(2,0), Fraction(2,1), '2']:
...     print '%15s %s' % (n.__repr__(), isinstance(n, Number))
              2 True
            2.0 True
 Decimal('2.0') True
         (2+0j) True
 Fraction(2, 1) True
            '2' False

当然,这与鸭子类型(duck typing)是相反的。如果你更关心一个对象的行为而不是它是什么,那就像对待数字一样进行操作,并用异常来告诉你情况是否不同。

241

Python 3:

isinstance(x, (int, float, complex)) and not isinstance(x, bool)

Python 2:

isinstance(x, (int, long, float, complex)) and not isinstance(x, bool)

请注意,这个答案在处理Numpy对象时会出现错误。

339

测试你的变量是否是 numbers.Number 的一种实例:

>>> import numbers
>>> import decimal
>>> [isinstance(x, numbers.Number) for x in (0, 0.0, 0j, decimal.Decimal(0))]
[True, True, True, True]

这个方法使用了 抽象基类(ABCs),适用于所有内置的数字类,也适用于所有第三方类,只要它们是合格的(注册为 Number 抽象基类的子类)。

不过,在很多情况下,你不需要手动检查类型——Python 是 鸭子类型 的,也就是说,只要类型之间有点相似,通常就能正常工作。但是,如果某个操作不合理(比如 4 - "1"),就会报错,所以手动检查类型其实很少是必须的。这只是个额外的好处。你可以在完成一个模块时加上这个检查,以免让别人烦恼于实现细节。

这个方法从 Python 2.6 开始就可以用了。在更早的版本中,你只能检查几个硬编码的类型。

撰写回答