检查变量是否为整数

Hul*_*ulk 838 python

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

Kat*_*iel 1002

如果你需要这样做,那就做吧

isinstance(<var>, int)
Run Code Online (Sandbox Code Playgroud)

除非您在Python 2.x中,否则您需要

isinstance(<var>, (int, long))
Run Code Online (Sandbox Code Playgroud)

不要用type.它几乎从来都不是Python中的正确答案,因为它阻止了多态性的所有灵活性.例如,如果你是子类int,你的新类应该注册为int,而type不会:

class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True
Run Code Online (Sandbox Code Playgroud)

这符合Python强大的多态性:你应该允许任何行为类似的对象int,而不是强制它是一个.

然而,经典的Python心态是,请求宽恕比获得更容易.换句话说,不要检查是否x是整数; 假设它是并且如果不是,则捕获异常结果:

try:
    x += 1
except TypeError:
    ...
Run Code Online (Sandbox Code Playgroud)

这种心态是慢慢地被使用超越抽象基类,这让你注册什么性质的对象应该具有通过使从特殊构造的类继承(添加?乘?翻一番?).这将是最好的解决办法,因为这将允许确切必要的和足够的属性的对象,但你必须阅读有关如何使用它的文档.

  • 对于Python 2.x来检查整数,你真的需要使用`isinstance(x,(int,long))`.毕竟`long`也是一个整数! (35认同)
  • 因为Python`bool`(True,False)是`int` =的子类.这是Python的一个设计决定,布尔就像整数一样,它与任何对象都可以被评估为布尔值的概念密切相关. (7认同)
  • @katrielalex这对你来说听起来很愚蠢,但是你能解释一下为什么`isinstance(True,int)`返回True. (4认同)
  • 嗯.我想知道BUT部分!是不是正确和清晰的数据检查方法输入(例如,开始,在开始使用变量之前)python中的良好实践,因为它通常应该在任何编程中?因此,例如,在我想要通过id获取objetc(这是一个整数)时向数据库查询提供数据之前,我检查输入是否实际上是整数并且在将其交给数据库层之前是可用的. (3认同)
  • @Henning我相信"Pythonic"的回答是"不".通过鸭子打字,如果它会导致数据库级别的错误,那么这只是一个问题,并且没有办法判断是否是基于类型的情况.所以根据BUT部分,最好的做法是简单地让数据库层抛出错误并在它出现时处理它.可以使用任何具有兼容行为的东西; `int` /`long`问题就是一个很好的例子; 如果有人有自定义的"短"类型怎么办?它与`int`和数据库兼容,但是如果它检查了类型,你的代码就不会接受它. (3认同)
  • @DrBailey也可以做``x + 42``没有任务.仍然有效的python,不会修改任何东西. (2认同)

sar*_*ele 97

到目前为止,所有提出的答案似乎都错过了一个事实:double(python中的浮点数实际上是双精度数)也可以是一个整数(如果它在小数点后面没有任何内容).我is_integer()在双打上使用内置方法来检查这个.

示例(在for循环中每隔x次执行一次操作):

for index in range(y): 
    # do something
    if (index/x.).is_integer():
        # do something special
Run Code Online (Sandbox Code Playgroud)

编辑:

在调用此方法之前,您始终可以转换为浮点数.三种可能性:

>>> float(5).is_integer()
True
>>> float(5.1).is_integer()
False
>>> float(5.0).is_integer()
True
Run Code Online (Sandbox Code Playgroud)

否则,你可以像Agostino一样检查它是否是一个int:

def is_int(val):
    if type(val) == int:
        return True
    else:
        if val.is_integer():
            return True
        else:
            return False
Run Code Online (Sandbox Code Playgroud)

  • 没有太多,但这里是官方文档:http://docs.python.org/2/library/stdtypes.html#float.is_integer (4认同)
  • 很高兴知道.虽然,它是一个`float`方法,所以它不是一个通用函数,可以应用于任何类型来确定它是否是一个整数. (4认同)
  • 首先检查它是否为`int`(或`long`),然后检查它是否为`float`,如果是,则检查`is_integer()`是否为真.请注意,Python 3中没有"long"类型. (3认同)
  • 你有这个`is_integer`函数的文档链接吗?我找不到一个. (2认同)
  • `int(x)== x`也涵盖了浮点数。 (2认同)

Sco*_*ths 65

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

>>> import numbers
>>> isinstance(3, numbers.Integral)
True
Run Code Online (Sandbox Code Playgroud)

这不限制的检查只int,或者只是intlong,但也允许表现为整数工作的其他用户定义类型.

  • @endolith:我的答案(以及其他人)说明变量的类型是否是整数,而不是变量本身是否可以转换为整数而不会丢失信息.所以是的,你的例子是'False`,就像检查'5.00`的'整数'一样. (6认同)
  • `isinstance(Fraction(5,1),numbers.Integral)`→False.是对的吗? (3认同)
  • ...但我想你也可以按照'type(f)(int(f))== f`的方式做一个'这个对象是否完全可以表示为整数'测试. (3认同)
  • @martineau:但是该方法没有获得用户定义的整数类型,这是使用抽象基类的重点.对特定数字的测试肯定是一个黑客 - 显而易见的一点是,你选择的数字不适用于64位Python 2.x. (2认同)

end*_*ith 63

以下是此处提到的不同方法的摘要:

  • int(x) == x
  • try x = operator.index(x)
  • isinstance(x, int)
  • isinstance(x, numbers.Integral)

以下是它们如何应用于具有整数值的各种数值类型:

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

您可以看到它们不是100%一致的.Fraction和Rational在概念上是相同的,但是一个提供.index()方法而另一个不提供.复杂类型不喜欢转换为int,即使实部是整数而虚部是0.

(np.int8|16|32|64(5)意味着np.int8(5),np.int32(5)等所有的行为相同)


Mat*_*ner 37

>>> isinstance(3, int)
True
Run Code Online (Sandbox Code Playgroud)

请看这里了解更多.

请注意,如果您正在寻找int类似属性,这无济于事.在这种情况下,您可能还想检查long:

>>> isinstance(3L, (long, int))
True
Run Code Online (Sandbox Code Playgroud)

我已经在Python源代码中看到了这种针对数组/索引类型的检查,但我不认为在C之外可见.

Token SO回复:你确定你应该检查它的类型吗?要么不通过一种你无法处理,或者不要试图智取你的潜在的代码重用者,他们可能有一个很好的理由不为int传递给你的函数.

  • @Hulk:为什么那个案子很特别? (2认同)
  • @Hulk:"如果变量的值不是整数,则不进一步处理"最好由循环周围的异常处理.这不需要任何类型检查. (2认同)

Par*_*rsa 19

为什么不尝试类似的东西:

if x%1 == 0: 
Run Code Online (Sandbox Code Playgroud)

  • @Dennis:但这也适用于小数部分等于零的浮点数.你可以将它包装在一个函数中,它将是显式的. (19认同)
  • -1因为这不是我希望在制作中或我的队友看到的代码.它隐藏了你的意图.这里的大多数其他答案都更明确,应该是首选. (7认同)

Dai*_*dow 18

而不是复杂的事情,为什么不简单

if type(var) is int:
Run Code Online (Sandbox Code Playgroud)

  • 不要使用type(),因为它不会始终有效,而是使用isinstance().请参阅上面的答案http://stackoverflow.com/a/3501408/2574719 (4认同)

小智 13

我在我的所有软件中使用的一种简单方法就是这样.它检查变量是否由数字组成.

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

  • 这适用于字符串形式的var,但适用于已经为数字的var崩溃(isdigit()是python中的字符串方法)。 (2认同)

flo*_*low 12

当这样一个基本的,有效的,我相信的平凡问题被提出时,看到如此热烈的讨论,真是令人震惊.

有些人指出,针对int(和long)的类型检查可能会丢失遇到大十进制数的情况.完全正确.

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

我很多帖子都大力宣称你不应该检查类型.好吧,GvR曾经说过这样的结论:在纯理论中,这可能是正确的,但在实践中,isinstance往往是有用的目的(不久之前,没有链接;你可以阅读GvR关于相关问题的说法)在像这样的帖子中).

有趣的是,有多少人似乎认为OP的意图是检查给定的类型是否x是数字整数类型 - 我所理解的是我在使用OP的单词时通常的意思:是否x表示整数.这可能非常重要:比如告诉别人他们想要选择多少项,你可能想要检查一下你得到一个非负整数.像这样的用例比比皆是.

在我看来,重要的是要看到(1)类型检查只是一个 - 并且通常非常粗略地衡量程序的正确性,因为(2)它通常是有意义的有意义的值,并且超出范围的值这让人胡说八道.有时只是一些间歇性的值有意义 - 考虑到所有数字,在给定的情况下,只有那些真实的(非复杂的)整数才有可能.

有趣的非人似乎提到检查x == math.floor( x ).如果那应该给出一些大的十进制类错误,那么也许是时候重新思考OOP范式了.还有PEP 357考虑如何使用不那么明显int但肯定是整数的值作为列表索引.不确定我是否喜欢这个解决方案.


Jun*_*ter 8

在这里找到一个关于SO本身的相关问题.

Python开发人员更喜欢不检查类型,而是执行特定于类型的操作并捕获TypeError异常.但如果您不知道该类型,那么您有以下内容.

>>> i = 12345
>>> type(i)
<type 'int'>
>>> type(i) is int
True
Run Code Online (Sandbox Code Playgroud)

  • -1你至少应该解释为什么不这样做.只是发布此代码会促进糟糕的Python.(我讨厌这个,因为它在技术上是正确的,但它不应该被投票.) (3认同)

小智 8

在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")
Run Code Online (Sandbox Code Playgroud)


Not*_*yne 7

为什么不检查您要检查的值是否等于自身强制转换为整数,如下所示?

def isInt(val):
    return val == int(val)
Run Code Online (Sandbox Code Playgroud)

  • 需要用`try/except`块封闭(或替换)测试,否则如果`val`是,则会抛出异常,例如,`'a' (2认同)
  • 到目前为止,它们唯一的解决方案也适用于numpy整数! (2认同)

小智 7

如果你想检查一个字符串只包含数字,但转换为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"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果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"
Run Code Online (Sandbox Code Playgroud)

这实际上显示了在不使用异常的情况下问题发生的位置.同样,这不是用于测试类型,而是用于测试字符本身.这比简单地检查类型提供了更多的灵活性,尤其是在类型之间进行转换时可能会丢失重要的字符串数据,例如前导0.


kxr*_*kxr 5

numpy检查的情况下,例如 ..

isinstance(var, numbers.Integral)
Run Code Online (Sandbox Code Playgroud)

..(慢)或..

isinstance(var, (int, long, np.integer))
Run Code Online (Sandbox Code Playgroud)

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

long在 PY3 中下降)

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

var & 0 == 0 
Run Code Online (Sandbox Code Playgroud)

因为真理和非例外可能是一个不错的选择。同样,专门检查有符号整数类型

var ^ -1 ==  -var - 1
Run Code Online (Sandbox Code Playgroud)


Pra*_*ama 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    
Run Code Online (Sandbox Code Playgroud)


tra*_*uil 5

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

try :
    int(a);
    #Variable a is int
except ValueError : 
    # Variable a is not an int
Run Code Online (Sandbox Code Playgroud)


Far*_*ani 5

您也可以使用str.isdigit。尝试向上看help(str.isdigit)

def is_digit(str):
      return str.isdigit()
Run Code Online (Sandbox Code Playgroud)

  • 对于负整数,“isdigit()”返回“False” (3认同)