如何检查我的 python 对象是不是为数字? [复制]

Posted

技术标签:

【中文标题】如何检查我的 python 对象是不是为数字? [复制]【英文标题】:How can I check if my python object is a number? [duplicate]如何检查我的 python 对象是否为数字? [复制] 【发布时间】:2011-05-10 09:17:31 【问题描述】:

在 Java 中,数字类型都来自 Number,所以我会使用

(x instanceof Number).

python 等价物是什么?

【问题讨论】:

不是真正的重复,另一个是这个问题的一个非常具体的案例(检查某个东西是否是向量中的数字),大多数投票的答案确实与那个细节有关。 将 x 乘以零。如果结果不是零,则 x 不是数字,请参阅:***.com/a/44418960/3419693 【参考方案1】:

测试你的变量是否是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 ABC 的子类)。

但是,在许多情况下,您不必担心手动检查类型 - Python 是 duck typed,混合一些兼容的类型通常是可行的,但是当某些操作没有意义时,它会发出错误消息 (4 - "1" ),因此很少需要手动检查。这只是一个奖金。您可以在完成模块时添加它,以避免在实现细节上纠缠他人。

这适用于starting with Python 2.6。在旧版本上,您几乎只能检查一些硬编码类型。

【讨论】:

当你传递一个布尔值时,这会给出一个误报:isinstance(True, numbers.Number) 返回True,即使True 显然不是一个数字。 @AlexKahn 在 Python 中,布尔值实际上是数字:bool 继承自 intabs(True) == 1"foo" * False == ""sum([True, False, True]) == 2"%f" % True == "1.0" 等等。 令人沮丧的是,isinstance(float('nan'), numbers.Number) 返回True 要排除布尔值,您可以使用以下内容。 isinstance(x, numbers.Number) and not isinstance(x, bool) 您也可以使用type(x) in (int, float, complex) 来检查x 是否直接是这些类型之一,而不是它们的实例【参考方案2】:

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 对象。

【讨论】:

谢谢,这最终在 Jython 中为我工作(这是 python 2.5,所以它没有“数字”包)。是的,我有一个真正的理由来打破鸭子打字;我需要区别对待字符串和数字。 isinstance(Decimal(10), (int, long, float, complex)) 给出False。 -1 如果x 是布尔值,这也不起作用。 isinstance(True, (int, long, float, complex)) 返回True @AlexKahn isinstance(True, numbers.Number)isinstance(False, numbers.Number) 也返回 True。 简短说明:float('nan') 可能被认为是非数字的,但这当然会返回 True【参考方案3】:

使用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

当然,这与鸭式打字相反。如果您更关心对象的行为方式而不是它是什么,请像有一个数字一样执行您的操作,并使用异常来告诉您其他情况。

【讨论】:

“看看有没有异常”的策略往往是无效的。 Python 在允许对各种非算术事物进行算术类型运算方面有点激进——所以仅仅因为一个对象允许 +* 并不意味着它就像一个数字。【参考方案4】:

当然可以使用isinstance,但请注意,这不是 Python 的工作方式。 Python 是一种鸭子类型的语言。您不应该明确检查您的类型。如果传递了不正确的类型,将引发 TypeError

所以假设它是int。不要费心检查。

【讨论】:

如前所述,duck-typing 的全部意义在于允许同一类中的方法重载和方法多态性。 鸭式打字并不总是可行的。有时,最好在函数开头有一个小检查段落并失败或修复输入,而不是将整个代码封装在 try-except 中,这会使整个代码难以阅读。【参考方案5】:

这并不是 python 的真正工作方式。就像使用数字一样使用它,如果有人传递给你一些不是数字的东西,那就失败了。传入正确的类型是程序员的责任。

【讨论】:

...但前提是它们被触发。在“正常”情况下,它们比if 语句便宜。 并不总是那么简单,有时两种类型都支持接口,但您希望以不同的方式处理它们。考虑一个应该添加数字但不连接字符串的 reduce 函数。 这个答案是假设最幼稚的脚本,不考虑复杂的情况。正如 Rob 所说,处理数字而不是字符串是合法的需求。在许多情况下,自定义类在乘以数字时需要以一种方式运行,而在乘以自身的实例时需要以不同的方式运行。您可能会以这种方式实现一个矩阵类。 @Falmarri 绝对可以...docs.python.org/2/reference/… 防御性编程是必要的,尤其是当您使用这些值在例如数据库中执行数据操作操作时。动态语言很棒,但有时您需要保证。

以上是关于如何检查我的 python 对象是不是为数字? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查数字是不是可以被另一个Python整除

Python/FLASK - html 表单返回字符串。如何检查它是不是包含数字?

如何在Python 3中检查给定数字是不是是阶乘[关闭]

如何使用Python检查数字是否为32位整数?

检查列是不是包含类型字符串(对象)

在python中检查字符串是不是为数字[重复]