检查一个variables是否是一个整数

我如何检查一个variables是否是一个整数?

如果你需要这样做,那么

 isinstance(<var>, int) 

除非你在Python 2.x中,在这种情况下你想要的

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

不要使用type 。 Python几乎从来都不是正确的答案,因为它阻止了多态的所有灵活性。 例如,如果你inheritance了int ,你的新类应该注册为一个int type不能这样做:

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

这符合Python的强大的多态:你应该允许任何象int一样的对象,而不是强制它是一个对象。

但是,古典的Python思想是, 请求宽恕比允许要容易 。 换句话说,不要检查x是否是一个整数; 假设它是,并且如果不是,则捕获exception结果:

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

这种心态正在慢慢被使用抽象基类所超越,它使您能够通过使其从特殊构造的类inheritance来精确地注册对象应具有的属性(添加“倍增”)。 这将是最好的解决scheme,因为它将准确地允许具有必要和足够属性的对象,但是您将必须阅读关于如何使用它的文档。

到目前为止,所有提出的答案都似乎错过了一个事实,即双精度浮点数(实际上是双精度浮点数)也可以是一个整数(如果小数点后面没有任何内容)。 我在双打上使用内build的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 

否则,你可以像阿戈斯蒂诺那样检查它是否是一个int:

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

如果你真的需要检查,那么最好使用抽象基类而不是具体的类。 对于一个整数,这将意味着:

 >>> import numbers >>> isinstance(3, numbers.Integral) True 

这不会限制检查只是int ,或者只是intlong ,但也允许其他用户定义types的行为作为整数工作。

 >>> isinstance(3, int) True 

看到这里更多。

请注意,如果您正在寻找类似int的属性,这并没有帮助。 在这种情况下,您可能还想检查long

 >>> isinstance(3L, (long, int)) True 

我已经在Python源码中看到了这种types的数组/索引types的检查,但我不认为在C之外是可见的。

令牌SO回复:你确定你应该检查它的types? 要么不传递一个你不能处理的types,要么不试图超越你的潜在的代码重用者,他们可能有一个很好的理由不把int传递给你的函数。

为什么不只是一个简单的东西,而不是复杂的东西

 if type(var) is int: 

为什么不尝试像这样的:

 if x%1 == 0: 

当这样一个基本的,有效的,我相信是世俗的问题被问到的时候,看到这样一个热烈的讨论即将来临,真是令人震惊。

有些人指出,对int (和long )进行types检查可能会遇到遇到大十进制数的情况。 完全正确。

有人指出你应该“做x + 1 ,看看是否失败。 一方面,这也适用于浮点数,另一方面,构build一个绝对不是数字类的类很容易,但是以某种方式定义了+运算符。

我与许多post不一致,强烈地声明你不应该检查types。 GvR曾经说过,在纯理论中,这可能是对的,但在实践中, isinstance往往是有用的(前一阵子,没有链接;你可以阅读GvR所说的相关内容在这个post中的问题)。

有趣的是,有多less人似乎认为OP的意图是检查一个给定xtypes是否是一个数字整数types – 我所理解的是我通常在使用OP的话时的意思:是否x代表一个整数。 这可能是非常重要的:例如问问他们想要挑选多less物品,你可能想要检查你得到一个非负的整数。 像这样的用例比比皆是。

在我看来,重要的是要看到(1)types检查不过是程序正确性的一个 – 而且往往是相当粗略的度量 – 因为(2)它通常是有限的值是有意义的,超出边界的值这使废话。 有时候只是一些间断的值是合理的,就像考虑所有的数字一样,只有那些真实的(非复杂的)整数才可能在给定的情况下。

有趣的非人似乎提到检查x == math.floor( x ) 。 如果这应该给一些大的小数类错误,那么也许现在是重新考虑OOP范例的时候了。 还有PEP 357考虑如何使用不那么明显的int -but-certainly-integer-like值来作为列表索引。 不知道我是否喜欢这个解决scheme。

我在我的所有软件中使用的一个简单的方法是这样的。 它检查variables是否由数字组成。

 test = input("Enter some text here: ") if test.isdigit() == True: print("This is a number.") else: print("This is not a number.") 

如果你想检查一个string只包含数字,但转换为一个int不会帮助,你总是可以使用正则expression式。

 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”,则将其转换为数字types将引发ValueError,但数据在该过程中也将丢失。 使用正则expression式并捕获AttributeError将允许您确认string中的数字字符,例如前导0。

如果你不想抛出一个AttributeError,而只想寻找更具体的问题,你可以改变正则expression式,只检查匹配:

 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" 

这实际上显示了问题发生的地方,而没有使用例外。 再次,这不是testingtypes,而是字符本身。 与简单地检查types相比,这给你更多的灵活性,尤其是在types之间的转换可能会丢失重要的string数据(比如前导0)的时候。

在这里find一个相关的问题本身。

Python开发人员更喜欢不检查types,而是执行特定于types的操作并捕获TypeErrorexception。 但是,如果你不知道这种types,那么你有以下几点。

 >>> i = 12345 >>> type(i) <type 'int'> >>> type(i) is int True 

为什么不只是检查你想检查的值是否等于本身投射为一个整数,如下所示?

 def isInt(val): return val == int(val) 

如果variablesinput像一个string(例如'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))检查了它,但是它是更长的代码。 我想知道资源或速度的使用是否有所不同。

使用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') 

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

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

这里是一个简单的例子,你如何确定一个整数

 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 

我正在编写一个程序来检查一个数字是否正方形,而且我遇到了这个问题,我使用的代码是:

 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!") 

为了判断这个数是否是一个整数,我把从用户input的平方根得到的浮点数转换为一个舍入整数(作为值存储),如果这两个数相等,那么第一个数必须是整数,程序来响应。 这可能不是这样做的最短的方式,但它为我工作。

如果你只是需要这个operator.index__index__特殊方法)是我认为的方法。 因为它应该适用于所有可以安全地转换为整数的types。 即浮动失败,整数,甚至花式整数类没有实现整体抽象类工作鸭input。

operator.index是什么用于列表索引等。在我看来,它应该被用于更多/推广。

实际上,如果你想确定由于截断问题等原因而导致的浮点数被拒绝,并且它可以与所有整型types(即numpy等)一起工作的话,那么我认为这是得到整数值的唯一正确方法。他们可能还不支持抽象类。

这就是__index__引入的!

如果您不想考虑Python版本(2.x和3.x),请使用six ( PyPI ),它是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) 
 #!/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) 

如果你没有int,你可以这样做:

 var = 15.4 if(var - int(var) != 0): print "Value is not integer" 

将尝试检查作为string给出的整数和整数的更一般的方法将是

 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 

如果您正在从文件中读取数据,并且您的数组或字典中包含多个数据types的值,则以下内容将非常有用。 只要检查variables是否可以被转换为int(或任何其他您想要执行的数据types)。

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

你可以这样做:

 name = 'Bob' if type(name) == str: print 'this works' else: print 'this does not work' 

它会返回'这个作品'…但如果你改名为int(1),那么它将返回'这是行不通的,因为它现在是一个string…你也可以尝试:

 name = int(5) if type(name) == int: print 'this works' else: print 'this does not work' 

同样的事情会发生

还有另一个选项来做types检查。

例如:

  n = 14 if type(n)==int: return "this is an int" 

你可以这样做。

 if type(x) is int: 

考虑情况x = n **(1.0 / m),其中n = 10 ** 5,m = 5。 在Python中,x将是10.000000000000002,由于浮点算术运算,它只是非整数。

所以我会检查

 if str(float(x)).endswith('.0'): print "It's an integer." 

我用这个代码testing了它:

 for a in range(2,100): for b in range(2,100): x = (a**b)**(1.0/b) print a,b, x, str(float(x)).endswith('.0') 

它为所有a和b输出True。

 ####################################### # Value_Is_Int ####################################### def value_is_int(value): try: tempVal = int(value) return True except: return False 

调用这个函数:

 if value_is_int(value): print "Integer" else: print "Not integer" 

我可以检查,如果数字是整数包括数字如7.0

 def is_int(x): if x - round(x) == 0 : return True else: return False 
 if type(input('enter = '))==int: print 'Entered number is an Integer' else: print 'Entered number isn't an Integer' 

这将工作检查是否是一个整数或不

 import numpy as np if (np.floor(x)-x == 0): return "this is an int"