检查变量是否为整数

1151 投票
41 回答
2027346 浏览
提问于 2025-04-16 02:54

我怎么检查一个变量是不是整数呢?

41 个回答

155

到目前为止,所有提出的答案似乎都忽略了一个事实,那就是在Python中,双精度浮点数(float实际上是双精度浮点数)也可以是整数(如果小数点后面没有数字的话)。我会使用内置的 is_integer() 方法来检查这一点。

举个例子(在一个for循环中每隔x次做某件事):

for index in range(y): 
    # do something
    if (index/x.).is_integer():
        # do something special

补充:

在调用这个方法之前,你总是可以先转换成浮点数。这里有三种可能性:

>>> float(5).is_integer()
True
>>> float(5.1).is_integer()
False
>>> float(5.0).is_integer()
True

另外,你也可以像Agostino说的那样,先检查它是否是整数:

def is_int(val):
    if type(val) == int:
        return True
    else:
        if val.is_integer():
            return True
        else:
            return False
179

这里总结了几种不同的方法:

  • int(x) == x:检查一个数是否等于它转换成整数后的值。
  • try x = operator.index(x):尝试用这个方法把数变成索引,如果成功就说明它是整数。
  • isinstance(x, int):检查这个数是不是整数类型。
  • isinstance(x, numbers.Integral):检查这个数是否属于整数的范围。

接下来看看这些方法如何适用于不同的数字类型,这些类型的值都是整数:

检查Python数字类型是否为整数的方法表

你会发现这些方法并不是完全一致的。分数和有理数在概念上是相同的,但一个有.index()方法,另一个没有。复数类型即使它的实部是整数,虚部是0,也不喜欢转换成整数。

(np.int8|16|32|64(5)表示np.int8(5)np.int32(5)等都表现得一样)

1400

如果你需要这样做,可以使用

isinstance(<var>, int)

不过如果你在使用Python 2.x,那你应该用

isinstance(<var>, (int, long))

不要使用 type。在Python中,这几乎从来不是正确的做法,因为它限制了多态的灵活性。举个例子,如果你创建了一个新的类,继承自 int,那么你的新类应该被识别为一个 int,而 type 是做不到这一点的:

class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True

这符合Python强大的多态性:你应该允许任何表现得像 int 的对象,而不是强制要求它必须是一个 int

但是

传统的Python思维是,请求原谅比请求许可更容易。换句话说,不要检查 x 是否是整数;假设它是整数,如果不是再捕捉异常结果:

try:
    x += 1
except TypeError:
    ...

这种思维方式正在逐渐被使用抽象基类所取代,这让你可以精确地注册你的对象应该具备哪些属性(比如加法?乘法?翻倍?),通过让它继承一个特别构建的类。这将是最佳解决方案,因为它允许恰好那些具有必要和充分属性的对象,但你需要阅读文档来了解如何使用它。

撰写回答