检查变量是否为整数

1136

如何检查一个变量是否为整数?


3
你好,@Hulk的话似乎让你认为type是解决这个问题的正确方式,但这(几乎肯定)不是正确的方式。 - Katriel
2
@ Hulk:没有冒犯之意。但需要明确的是,我所知道的唯一捕获异常的方法是使用 except 子句。我建议你捕获 TypeError 异常。 - Jungle Hunter
17
这个问题存在歧义,因此答案也被分成了不同的部分。一些人回答如何检查变量的类型(例如,5→True,5.0→False),而另一些人回答如何检查值是否为整数(例如,5→True,5.0→True,Fraction(5,1)→True,5.4→False)。也许应该相应地将问题和答案拆分开来? - endolith
1
最简单的方法(适用于Python 2.7.11)是int(var)== var。适用于.0浮点数,返回布尔值。 - oisinvg
2
你是指“如何确定变量的类型是整数?”还是“如何确定变量的值是整数?” - Benice
显示剩余7条评论
41个回答

3

如果你想不考虑Python版本(2.x vs 3.x)进行检查,请使用sixPyPI)和它的integer_types属性:

import six

if isinstance(obj, six.integer_types):
    print('obj is an integer!')

在非常轻量级的单文件模块six中,它仅仅是这样做:

import sys
PY3 = sys.version_info[0] == 3

if PY3:
    integer_types = int,
else:
    integer_types = (int, long)

3
如果你只需要,我认为operator.index__index__特殊方法)是一个好选择。因为它应该适用于所有可以安全转换为整数的类型。例如,浮点数会失败,整数、甚至不实现Integral抽象类的花哨整数类都可以通过鸭子类型工作。 operator.index是用于列表索引等的方法。在我看来,它应该被更多地使用/推广。
事实上,如果你想确保浮点数由于截断问题等被拒绝,并且它适用于所有整数类型(即numpy等),即使它们可能(尚)不支持抽象类,我认为这是获取整数值的唯一正确方式。
这就是__index__引入的原因!

看起来正是需要的东西。不过有个奇怪的问题:它接受True和False,但不将它们映射到1和0,而是返回相同的值(使用py2.7)。可能是因为bool是int的子类,这被认为足够好用于索引。您可以始终执行int(operator.index(x))以确保获得真正的整数。 - greggo

2
#!/usr/bin/env python

import re

def is_int(x):

    if(isinstance(x,(int,long))):

        return True
    matchObj = re.match(r'^-?\d+\.(\d+)',str(x))

        if matchObj:

        x = matchObj.group(1)

        if int(x)-0==0:

            return True

     return False

print is_int(6)

print is_int(1.0)

print is_int(1.1)

print is_int(0.1)

print is_int(-956.0)

2

我正在编写一个程序来检查一个数字是否为完全平方数,但是我遇到了这个问题,我使用的代码如下:

import math
print ("this program will tell you if a number is square")
print ("enter an integer")
num = float(input())
if num > 0:
    print ("ok!")
    num = (math.sqrt(num))
    inter = int(num)
    if num == inter:
            print ("It's a square number, and its root is")
            print (num)
    else:
            print ("It's not a square number, but its root is")
            print (num)
else:
    print ("That's not a positive number!")

为了判断一个数字是否为整数,我将从用户输入的数字平方根得到的浮点数转换为四舍五入的整数(存储为值),如果这两个数字相等,则第一个数字必须是整数,程序就可以做出响应。这可能不是最短的方法,但对我来说有效。

那似乎不是一个正确的算法,因为它会在整数大于浮点数尾数所能容纳的范围时失败。试着用12345678901234567890123456789012(这不是一个完全平方数)来测试一下,看看它是否给出了正确的答案。你应该实现一个整数平方根算法。 - Craig McQueen
请参考这个问题关于Python中整数平方根的问题。 - Craig McQueen

2
如果你没有int,你可以这样做:
var = 15.4
if(var - int(var) != 0):
    print "Value is not integer"

如果变量是字符串,这种方法就行不通了。你需要捕获异常等。最好参考https://dev59.com/l3A75IYBdhLWcg3wDUco#3501408。 - goetz

2

如果你想编写兼容Python 2-3的代码

要测试一个值是否为整数(任何类型),你可以这样做:

# Python 2 and 3: 
import sys
if sys.version_info < (3,):
    integer_types = (int, long,)
else:
    integer_types = (int,)

>>> isinstance(1, integer_types)
True

# Python 2 only:
if isinstance(x, (int, long)):
     ...

# Python 3 only:
if isinstance(x, int):
    ...

来源: http://python3porting.com/differences.html

Python 2 和 Python 3 在语法和库方面有很多不同之处。以下是一些主要的区别:

  • print语句变成了print函数。
  • 除法运算符/的行为发生了变化,它现在总是执行真正的除法。如果需要整数除法,可以使用//运算符。
  • 所有的字符串都是Unicode类型,而不是像Python 2中的ASCII字符串。
  • range()函数现在返回一个迭代器对象,而不是列表。
  • xrange()函数已被删除,因为range()函数现在相当于Python 2中的xrange()函数。
  • 异常语法发生了变化,raise语句不再需要逗号来分隔异常类型和参数。
  • exec语句已经被删除,而exec()函数仍然存在。
  • 元组比较现在采用字典排序,而不是比较元素。

2
一个更普遍的方法会尝试检查整数和以字符串形式给出的整数,代码如下:
def isInt(anyNumberOrString):
    try:
        int(anyNumberOrString) #to check float and int use "float(anyNumberOrString)"
        return True
    except ValueError :
        return False

isInt("A") #False
isInt("5") #True
isInt(8) #True
isInt("5.88") #False *see comment above on how to make this True

2
你可以做到这一点。
if type(x) is int:

1
val=3
>>> isinstance(val,int ) 
True

将会工作。


负整数怎么办? - Sunny Tambi

1

最简单的方法是:

if n==int(n):
    --do something--    

n是变量


1
如果 n 不是 int 类型,这只会抛出一个未处理的异常。它也没有回答问题。 - Git.Coach
问题本身不清楚,因为他可能想知道变量是否有小数。 - Youssef Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接