首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查一个对象是否是一个数字,最常见的方法是什么?

检查一个对象是否是一个数字,最常见的方法是什么?
EN

Stack Overflow用户
提问于 2010-08-09 23:04:27
回答 8查看 37.7K关注 0票数 129

给定一个任意的python对象,确定它是否是一个数字的最佳方法是什么?这里,is被定义为acts like a number in certain circumstances

例如,假设您正在编写一个向量类。如果给定另一个向量,则需要找到点积。如果给定一个标量,则需要缩放整个向量。

检查某些东西是intfloatlongbool是很烦人的,而且不包括可能表现为数字的用户定义的对象。但是,例如,检查__mul__还不够好,因为我刚才描述的向量类将定义__mul__,但它不是我想要的那种数字。

EN

回答 8

Stack Overflow用户

发布于 2017-09-20 22:19:08

总结/评估现有方法:

代码语言:javascript
复制
Candidate    | type                      | delnan | mat | shrewmouse | ant6n
-------------------------------------------------------------------------
0            | <type 'int'>              |      1 |   1 |          1 |     1
0.0          | <type 'float'>            |      1 |   1 |          1 |     1
0j           | <type 'complex'>          |      1 |   1 |          1 |     0
Decimal('0') | <class 'decimal.Decimal'> |      1 |   0 |          1 |     1
True         | <type 'bool'>             |      1 |   1 |          1 |     1
False        | <type 'bool'>             |      1 |   1 |          1 |     1
''           | <type 'str'>              |      0 |   0 |          0 |     0
None         | <type 'NoneType'>         |      0 |   0 |          0 |     0
'0'          | <type 'str'>              |      0 |   0 |          0 |     1
'1'          | <type 'str'>              |      0 |   0 |          0 |     1
[]           | <type 'list'>             |      0 |   0 |          0 |     0
[1]          | <type 'list'>             |      0 |   0 |          0 |     0
[1, 2]       | <type 'list'>             |      0 |   0 |          0 |     0
(1,)         | <type 'tuple'>            |      0 |   0 |          0 |     0
(1, 2)       | <type 'tuple'>            |      0 |   0 |          0 |     0

(我是通过this question来到这里的)

代码

代码语言:javascript
复制
#!/usr/bin/env python

"""Check if a variable is a number."""

import decimal


def delnan_is_number(candidate):
    import numbers
    return isinstance(candidate, numbers.Number)


def mat_is_number(candidate):
    return isinstance(candidate, (int, long, float, complex))


def shrewmouse_is_number(candidate):
    try:
        return 0 == candidate * 0
    except:
        return False


def ant6n_is_number(candidate):
    try:
        float(candidate)
        return True
    except:
        return False

# Test
candidates = (0, 0.0, 0j, decimal.Decimal(0),
              True, False, '', None, '0', '1', [], [1], [1, 2], (1, ), (1, 2))

methods = [delnan_is_number, mat_is_number, shrewmouse_is_number, ant6n_is_number]

print("Candidate    | type                      | delnan | mat | shrewmouse | ant6n")
print("-------------------------------------------------------------------------")
for candidate in candidates:
    results = [m(candidate) for m in methods]
    print("{:<12} | {:<25} | {:>6} | {:>3} | {:>10} | {:>5}"
          .format(repr(candidate), type(candidate), *results))
票数 3
EN

Stack Overflow用户

发布于 2010-08-09 23:13:11

也许换一种方式更好:检查它是否是一个向量。如果是,你做一个点积,在所有其他情况下,你尝试标量乘法。

检查向量很容易,因为它应该是您的向量类类型(或从它继承的)。你也可以先试着做一个点积,如果失败了(=它不是真正的向量),那么就退回到标量乘法。

票数 2
EN

Stack Overflow用户

发布于 2014-08-05 21:31:01

只是为了补充一下。也许我们可以使用isinstance和isdigit的组合,如下所示来确定一个值是否是一个数字(int、float等)

如果isinstance(num1,int)或isinstance(num1,float)或num1.isdigit():

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3441358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档