给定一个任意的python对象,确定它是否是一个数字的最佳方法是什么?这里,is
被定义为acts like a number in certain circumstances
。
例如,假设您正在编写一个向量类。如果给定另一个向量,则需要找到点积。如果给定一个标量,则需要缩放整个向量。
检查某些东西是int
、float
、long
、bool
是很烦人的,而且不包括可能表现为数字的用户定义的对象。但是,例如,检查__mul__
还不够好,因为我刚才描述的向量类将定义__mul__
,但它不是我想要的那种数字。
发布于 2017-09-20 22:19:08
总结/评估现有方法:
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来到这里的)
代码
#!/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))
发布于 2010-08-09 23:13:11
也许换一种方式更好:检查它是否是一个向量。如果是,你做一个点积,在所有其他情况下,你尝试标量乘法。
检查向量很容易,因为它应该是您的向量类类型(或从它继承的)。你也可以先试着做一个点积,如果失败了(=它不是真正的向量),那么就退回到标量乘法。
发布于 2014-08-05 21:31:01
只是为了补充一下。也许我们可以使用isinstance和isdigit的组合,如下所示来确定一个值是否是一个数字(int、float等)
如果isinstance(num1,int)或isinstance(num1,float)或num1.isdigit():
https://stackoverflow.com/questions/3441358
复制相似问题