检查一个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
,或者只是int
和long
,但也允许其他用户定义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的意图是检查一个给定x
的types是否是一个数字整数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的操作并捕获TypeError
exception。 但是,如果你不知道这种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"