检查变量是否为整数

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个回答

12

当一个基本、有效,而且我相信平凡的问题被问出来时,看到如此激烈的讨论确实令人惊讶。

有些人指出,对int(和long)进行类型检查可能会漏掉遇到大十进制数字的情况。非常正确。

有些人指出,你应该“只需执行x + 1并查看是否失败”。好吧,首先,这也适用于浮点数。另一方面,很容易构造一个明显不是非常数值化的类,但以某种方式定义了+运算符。

我与很多强烈声明您不应检查类型的帖子意见不合。GvR曾经说过,在纯理论上,这可能是正确的,但在实践中,isinstance经常起到有用的作用(这是一段时间前的话语,没有链接;您可以在像这样的帖子中阅读GvR关于相关问题的观点)。

有趣的是,有多少人似乎认为OP的意图是检查给定x的类型是否为数值整数类型——我理解的是我通常使用OP的话语时所指的:是否x代表整数。这可能非常重要:就像问别人他们想要拿多少个物品一样,您可能需要检查您得到一个非负整数。

在我看来,重要的是要看到(1)类型检查只是程序正确性的一种措施——而且通常是相当粗略的措施,因为(2)有时有界值是有意义的,越界值是无意义的。有时候只有一些间歇值是有意义的——比如考虑所有数字,只有实数(非复数)、整数可能在某种情况下是可行的。

很有趣,似乎没有人提到检查 x == math.floor(x)。如果使用某些大十进制类时会出错,那么也许是时候重新思考面向对象编程范例了。此外,还有PEP 357,它考虑如何将不太明显但肯定像整数的值用作列表索引。不确定我是否喜欢解决方案。


1
这样的测试用例有一些涉及将整数视为特殊情况;对于这种情况,您可以准备好 x==math.floor(x)x == int(x) 来引发异常,然后将其视为“无”。但其他用例涉及希望尽早获得更清晰的异常,而不是在非整数参数不合理时稍后获得更令人困惑的异常。我们针对不同的用例提供了各种答案。 - greggo

8

如果您想检查一个字符串是否只由数字组成,但将其转换为int类型无法帮助,您可以始终使用正则表达式。

import re
x = "01234"
match = re.search("^\d+$", x)
try: x = match.group(0)
except AttributeError: print("not a valid number")

Result: x == "01234"

在这种情况下,如果 x 是"hello",将其转换为数字类型会引发ValueError,而且在此过程中也会丢失数据。使用正则表达式并捕获AttributeError将允许您确认字符串中的数字字符,例如前导0。
如果你不想抛出AttributeError,而是想查找更具体的问题,你可以改变正则表达式并只检查匹配项:
import re
x = "h01234"
match = re.search("\D", x)
if not match:
    print("x is a number")
else:
    print("encountered a problem at character:", match.group(0))

Result: "encountered a problem at character: h"

实际上,它可以在不使用异常的情况下显示出问题的所在。这并不是为了测试类型,而是为了测试字符本身。这比仅仅检查类型更灵活,尤其是当转换类型会丢失重要字符串数据(如前导 0)时。


不需要使用正则表达式来实现这个功能:all(ch in set(string.digits) for ch in x),但正如本页面其他地方指出的那样,这种方法并不好。 - Thijs van Dien

7
为什么不直接检查您要检查的值是否等于强制转换为整数的自身,如下所示?
def isInt(val):
    return val == int(val)

3
如果val的值为例如'a',则需要用try/except块来封装(或替换)测试,否则会抛出异常。 - MestreLion
1
可以替换为 return val == int(val),并且需要异常块,正如MestreLion所提到的。 - jpmc26

7

检查Python中的内容非常简单。您可以像这样操作:

假设您想要检查一个变量是否为整数!

## For checking a variable is integer or not in python

if type(variable) is int:
     print("This line will be executed")
else:
     print("Not an integer")

无法处理负整数。 - Sunny Tambi
isinstance() 几乎总是比使用 type() 更好的方式 - Stevko

5

这里有一个简单的例子,展示如何确定一个整数:

def is_int(x):
    print round(x),
    if x == round(x):
        print 'True',
    else:
        print 'False'

is_int(7.0)   # True
is_int(7.5)   # False
is_int(-1)    # True    

5

在使用numpy时,可以像这样进行检查..

isinstance(var, numbers.Integral)

.. (slow) or ..

isinstance(var, (int, long, np.integer))

为了匹配所有类型变体,如np.int8np.uint16等...

(在PY3中删除long)

识别来自任何地方的任何类似整数的对象是一个棘手的猜测游戏。检查

var & 0 == 0 

对于真实和无异常可能是一个不错的选择。同样地,专门检查有符号整数类型

var ^ -1 ==  -var - 1

5

如果您正在从文件中读取数据,并且有一个包含多种数据类型值的数组或字典,以下内容将很有用。只需检查变量是否可以强制转换为int(或任何其他您想要强制执行的数据类型)。

try :
    int(a);
    #Variable a is int
except ValueError : 
    # Variable a is not an int

如果您认为您的变量可能是列表等,请同时捕获 TypeError。 - Avizipi

4
如果变量像字符串一样输入(例如'2010'):
if variable and variable.isdigit():
    return variable #or whatever you want to do with it. 
else: 
    return "Error" #or whatever you want to do with it.

在使用这个方法之前,我用 try/except 和检查 (int(variable)) 来解决问题,但那段代码较长。我想知道是否有任何资源使用或速度上的差异。


1
这个不会处理例如“-3”之类的情况。 - DSM

4

一个简单的方法是直接检查除以1的余数是否为0。

if this_variable % 1 == 0:
    list.append(this_variable)
else:
    print 'Not an Integer!'

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

3

使用int函数来帮助

intchecker = float(input('Please enter a integer: '))
intcheck = 0
while intcheck != 1:
    if intchecker - int(intchecker) > 0:
        intchecker = float(input("You didn't enter a integer. "
                                 "Please enter a integer: "))
    else:
        intcheck = 1
print('you have entered a integer')

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