【问题标题】:Checking whether a variable is an integer or not [duplicate]检查变量是否为整数[重复]
【发布时间】:2011-03-30 21:44:16
【问题描述】:

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

【问题讨论】:

  • @Hulk:您似乎认为type 是正确的做法。 (几乎可以肯定)不是。
  • @Hulk:没有冒犯。但需要明确的是,捕获异常(我知道)的唯一方法是使用 except 子句。我建议你捕获TypeError 异常。
  • 这个问题有歧义,答案也相应划分。有些人回答如何检查变量的类型(5→True, 5.0→ False),而另一些人回答如何检查值是否为整数(5→True, 5.0→True, Fraction(5,1)→对,5.4→错)。也许问题和答案应该相应地分开?
  • 最简单的方法(适用于 Python 2.7.11)是 int(var) == var。适用于 .0 浮点数,返回布尔值。
  • 您的意思是“我如何确定变量的类型是否为整数?”或“如何确定变量的值是否为整数?”

标签: python integer


【解决方案1】:

如果你需要这样做,那么做

isinstance(<var>, int)

除非您使用的是 Python 2.x,否则您需要

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

不要使用type。它在 Python 中几乎从来都不是正确的答案,因为它阻碍了多态性的所有灵活性。例如,如果您将int 子类化,您的新类应该注册为int,而type 不会这样做:

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

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

但是

不过,经典的 Python 心态是请求宽恕比请求许可更容易。也就是说,不要检查x是否为整数;假设它是,如果不是,则捕获异常结果:

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

这种心态正逐渐被abstract base classes 的使用所取代,它可以让您准确地注册您的对象应该具有的属性(加法?乘法?加倍?),方法是使其继承自一个特殊构造的类。这将是最好的解决方案,因为它将恰好允许那些具有必要和足够属性的对象,但您必须阅读有关如何使用它的文档。

【讨论】:

  • 嗯。我想知道 BUT 部分!对方法输入进行正确和清晰的数据检查(例如开始,在开始对变量进行任何操作之前)在 python 中的良好实践,因为它通常应该在任何编程中?因此,例如,当我想通过 id(一个整数)获取 objetc 时,在我将数据提供给数据库查询之前,我会在将输入传递给数据库层之前检查输入是否实际上是整数并且可用。
  • @Henning 我相信“Pythonic”的答案是“不”。通过duck typing,如果它会导致数据库级别的错误只是一个问题,并且没有办法根据类型判断是否是这种情况。因此,根据 BUT 部分,最好的做法是让数据库层抛出错误并在出现错误时进行处理。可以使用任何具有兼容行为的东西; int/long 问题就是一个很好的例子;如果有人有自定义 short 类型怎么办?它与int 和数据库兼容,但如果检查类型,您的代码不会接受它。
  • @katrielalex 这对你来说可能听起来很愚蠢,但你能向我解释一下为什么 isinstance( True, int ) 会返回 True。
  • 因为 Python bool (True, False) 是 int =) 的子类任何对象都可以被评估为布尔值。
  • @DrBailey 也可以只做x + 42 没有分配。仍然有效的python并且不修改任何东西。
【解决方案2】:

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

否则,您可以像 Agostino 所说的那样首先检查它是否是 int:

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

【讨论】:

  • 你有这个is_integer函数的文档链接吗?我找不到。
  • 内容不多,但这里是官方文档:docs.python.org/2/library/stdtypes.html#float.is_integer
  • 很高兴知道。虽然,它是一个float 方法,所以它不是一个通用函数,可以应用于任何类型来判断它是否为整数。
  • 首先检查是否为int(或long),然后检查是否为float,如果是,则检查is_integer() 是否为真。请注意,Python 3 中没有 long 类型。
  • int(x) == x 也包括浮动。
【解决方案3】:

这里总结了这里提到的不同方法:

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

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

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

np.int8|16|32|64(5) 表示np.int8(5)np.int32(5) 等都表现相同)

【讨论】:

  • 您的sympy.Rational 测试并没有完全按照您的想法进行,因为sympy.Rational(5) 评估为sympy.Integer 的实例。任何会产生具有整数值的 Rational 的操作都会产生 Integer。
  • @user2357112 这怎么不是“我在想什么”?
  • 你说sympy.Rational支持operator.index,但它不支持。发生的事情是sympy 积极地切换到更具体的类型。 sympy.Rational(5) 并不真正适合表格的“理性”小节。
  • @user2357112 但是Rational(5) 甚至不存在。它立即转换为Integer,它确实支持operator.index
  • 我们似乎都明白这一点,但这不是您的回答所传达的信息。
【解决方案4】:

如果您真的需要检查,那么最好使用abstract base classes 而不是具体的类。对于一个整数,这意味着:

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

这不会将检查限制为仅int,或仅intlong,还允许其他行为为整数的用户定义类型工作。

【讨论】:

  • isinstance(Fraction(5,1), numbers.Integral) → 错误。对吗?
  • @endolith:我的回答(和其他人)说变量的类型是否为整数,而不是变量本身是否可以转换为整数而不会丢失信息。所以是的,您的示例是False,就像检查5.00 的“完整性”一样。
  • ...但我想您也可以按照type(f)(int(f)) == f 的行进行“此对象是否可以完全表示为整数”测试。
  • @martineau:但该方法没有获得用户定义的整数类型,这是使用抽象基类的重点。测试特定数字绝对是一种 hack - 显而易见的一点是,您选择的数字不适用于 64 位 Python 2.x。
  • @martineau:但该类型可能不是int 的子类,它可能只表示整数。一个例子是 numpy int16 类型。现在诚然,这也没有使用 ABC,但如果它想说它是一个整数类型的对象但实际上不想成为int,它可以。哦,等到他们构建 128 位 Python 版本 :)
【解决方案5】:
>>> isinstance(3, int)
True

请参阅here 了解更多信息。

请注意,如果您正在寻找类似int 的属性,这将无济于事。在这种情况下,您可能还需要检查long

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

我在 Python 源代码中看到过针对数组/索引类型的此类检查,但我认为这在 C 之外是不可见的。

Token SO 回复:你确定要检查它的类型吗?要么不要传递你无法处理的类型,要么不要试图超越你潜在的代码重用者,他们可能有充分的理由不将 int 传递给你的函数。

【讨论】:

  • +1:毕竟,decimal.Decimalfractions.Rational 经常在你仔细检查了int 的地方工作。提前进行类型检查可防止合法、适当使用。它不会阻止任何问题。
  • 我在字典中有一个变量,所以在这种情况下必须进行类型检查
  • @Hulk:为什么这种情况很特别?
  • 要求是,如果变量的值不是整数,则不要进一步处理..
  • @Hulk:“如果变量的值不是整数,则不要进一步处理”最好由循环周围的异常处理。这不需要任何类型检查。
【解决方案6】:

为什么不试试这样的:

if x%1 == 0: 

【讨论】:

  • -1 因为这不是我希望在生产中或由我的队友看到的代码。它隐藏了你的意图。这里的大多数其他答案都更加明确,应该首选。
  • @Dennis:但这也适用于小数部分为零的浮点数。您可以将其包装在一个函数中,它将是显式的。
  • 如果x 甚至不是一个数字,比如一个字符串怎么办?
  • 原来的问题不够具体,有两种解释; @Hulk 可以通过询问以下任一方式来消除歧义:“我如何确定变量的类型是否为整数?”或“如何确定变量的值是否为整数?”否决任何一种解释都是不公平的。
【解决方案7】:

与其把事情复杂化,不如简单一点

if type(var) is int:

【讨论】:

【解决方案8】:

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

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

【讨论】:

  • 这适用于字符串变量,但对于已经是数字的变量会崩溃(isdigit() 是 python 中的字符串方法)。
  • 对于负数和浮点数,isdigit 也返回 False'-10'.isdigit()'1.5'.isdigit()
【解决方案9】:

在 SO 上找到了 related question

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

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

【讨论】:

  • -1 你至少应该解释为什么不这样做。只是发布此代码会宣传糟糕的 Python。 (我讨厌对此投反对票,因为它在技术上是正确的,但不应该投反对票。)
  • 你去。你会很高兴地注意到它现在也没有被投票。
  • 谢谢。删除了反对票。 (尽管您可能会更加强调不使用type =p。)
【解决方案10】:

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

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

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

我与许多强烈声明您不应该检查类型的帖子不一致。好吧,GvR 曾经说过,在纯理论中,这可能是正确的,但在实践中,isinstance 通常有一个有用的目的(那是前一段时间,没有链接;你可以阅读 GvR 所说的关于posts like this one的相关问题。

有趣的是,有多少人似乎认为 OP 的意图是检查给定 xtype 是否是数字整数类型——我理解的是我通常的意思使用OP的话时:x是否代表整数。这可能非常重要:比如询问某人他们想要挑选多少物品,您可能想要检查您是否得到了一个非负整数。像这样的用例比比皆是。

在我看来,看到 (1) 类型检查只是程序正确性的一个——而且通常是相当粗略的——衡量程序正确性的方法也很重要,因为 (2) 它通常是有意义的有界值,并且超出- 限制无意义的值。有时只是一些间歇性的值是有意义的——比如考虑所有的数字,在给定的情况下,只有那些实数(非复数)整数可能是可能的。

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

【讨论】:

  • 这种测试的一些用例涉及将整数视为特殊情况;为此,您可以为x==math.floor(x)x == int(x) 引发异常做好准备,然后将其视为“否”。但其他用例涉及希望得到一个早期的、更清晰的异常,而不是稍后更混乱的异常,此时非整数参数没有意义。对于这个问题,我们有各种各样的答案,适用于不同的用例。
【解决方案11】:

您也可以使用str.isdigit。尝试查找help(str.isdigit)

def is_digit(str):
      return str.isdigit()

【讨论】:

  • 仅当 str 为字符串时才有效。整数没有 isdigit 或 is_digit 方法。
  • isdigit() 为负整数返回 False
【解决方案12】:

如果您想检查字符串是否仅由数字组成,但转换为 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),但正如本页其他地方所指出的那样,无论如何这是一个不好的方法。
【解决方案13】:

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

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

【讨论】:

  • 需要用try/except 块包围(或替换)测试,否则如果val'a',它将抛出异常
  • 可以替换为return val == int(val),并且需要MestreLion提到的异常块。
【解决方案14】:

在存在 numpy 的情况下,检查就像 ..

isinstance(var, numbers.Integral)

..(慢)或..

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

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

(在 PY3 中删除 long

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

var & 0 == 0 

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

var ^ -1 ==  -var - 1

【讨论】:

    【解决方案15】:

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

    【讨论】:

    • 无法处理负整数
    【解决方案16】:

    如果变量像字符串一样输入(例如'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)),但它的代码更长。不知道是不是在资源使用和速度上有什么区别。

    【讨论】:

    • 例如,这不会处理“-3”。
    【解决方案17】:

    这是一个如何确定整数的简单示例

    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    
    

    【讨论】:

      【解决方案18】:

      如果您只需要,我认为operator.index__index__ 特殊方法)是可行的方法。因为它应该适用于所有可以安全地转换为整数的类型。 IE。浮点数失败,整数,甚至没有实现 Integral 抽象类的花哨的整数类都通过鸭子类型来工作。

      operator.index 用于列表索引等。在我看来,它应该用于更多/提升。

      事实上,我认为这是获取整数值的唯一正确方法,如果您想确定浮点数、由于截断问题等被拒绝并且它适用于所有整数类型(即 numpy 等)。 ) 即使它们可能(还)不支持抽象类。

      这就是__index__引入的原因!

      【讨论】:

      • 似乎就是这样。不过奇怪的是:它接受 True 和 False 但不将它们映射到 1 和 0,它返回相同的值(使用 py2.7)。这可能是因为 bool 是 int 的一个子类,这对于索引来说已经足够好了。您可以随时使用int(operator.index(x)) 来确保真正的 int。
      【解决方案19】:

      如果您想检查而不考虑 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)
      

      【讨论】:

        【解决方案20】:

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

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

        【讨论】:

        【解决方案21】:

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

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

        【讨论】:

          【解决方案22】:

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

          【讨论】:

            【解决方案23】:

            你可以这样做。

            if type(x) is int:
            

            【讨论】:

              【解决方案24】:
              #######################################
              # 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"
              

              【讨论】:

                【解决方案25】:

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

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

                【讨论】:

                【解决方案26】:

                如果你想写一个 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

                【讨论】:

                  【解决方案27】:

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

                  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
                  

                  【讨论】:

                    【解决方案28】:

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

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

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

                    【讨论】:

                    • 这似乎不是一个正确的算法,因为它对于大于浮点尾数可以容纳的整数会失败。用12345678901234567890123456789012(不是正方形)试试看它是否给出了正确的答案。您应该改为实现整数平方根算法。
                    • 请参阅this question,了解整数平方根。
                    【解决方案29】:

                    你可以这样做:

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

                    它会返回 'this works'... 但是如果你将 name 更改为 int(1) 那么它将返回 'this doesn't work' 因为它现在是一个字符串... 你也可以试试:

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

                    同样的事情也会发生

                    【讨论】:

                      【解决方案30】:

                      还有另一个选项可以进行类型检查。

                      例如:

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

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-10-14
                        • 2011-01-12
                        • 2014-01-25
                        • 1970-01-01
                        • 2015-02-25
                        • 1970-01-01
                        • 2012-08-27
                        相关资源
                        最近更新 更多