检查变量是否为整数[重复]

2024-12-23 08:43:00
admin
原创
116
摘要:问题描述:如何检查变量是否是整数?解决方案 1:如果你需要这样做,请这样做isinstance(<var>, int) 除非你使用的是 Python 2.x,在这种情况下你需要isinstance(<var>, (int, long)) 不要使用type。它在 Python 中几乎从来...

问题描述:

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


解决方案 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:
    ...

这种心态正逐渐被抽象基类的使用所取代,抽象基类允许您通过让对象继承自专门构造的类来准确注册对象应具有的属性(加法?乘法?加倍?)。这将是最好的解决方案,因为它将允许具有必要和充分属性的对象,但您必须阅读有关如何使用它的文档。

解决方案 2:

以下是这里提到的不同方法的摘要:

  • 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)等的行为都相同)

解决方案 3:

到目前为止,所有提出的答案似乎都忽略了一个事实,即双精度数(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

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

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

解决方案 4:

如果您确实需要检查,那么最好使用抽象基类而不是具体类。对于整数,这意味着:

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

这并不限制检查是否仅仅是int,或仅仅int是和long,而且还允许其他表现为整数的用户定义类型工作。

解决方案 5:

>>> isinstance(3, int)
True

更多详情请参阅此处。

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

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

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

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

解决方案 6:

为什么不尝试类似这样的方法呢:

if x%1 == 0: 

解决方案 7:

与其让事情变得过于复杂,为什么不简单一点呢?

if type(var) is int:

解决方案 8:

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

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

解决方案 9:

在 SO 上发现了一个相关问题。

Python 开发人员更喜欢不检查类型,而是执行特定于类型的操作并捕获TypeError异常。但如果您不知道类型,则会出现以下情况。

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

解决方案 10:

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

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

解决方案 11:

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

有些人指出,对int(和long) 进行类型检查可能会在遇到大十进制数时丢失数据。完全正确。

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

我与许多强烈宣称不应检查类型的帖子意见不​​一。好吧,GvR 曾经说过类似这样的话,从纯理论上讲,这可能是正确的,但在实践中,isinstance通常会起到有用的作用(那是前一段时间的事了,没有链接;你可以在类似这样的帖子中阅读 GvR 对相关问题的看法)。

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

在我看来,同样重要的是要认识到:(1)类型检查只是程序正确性的一种(通常是相当粗略的)度量,因为(2)通常有界的值才有意义,而越界的值则毫无意义。有时只是一些间歇性值有意义——比如考虑所有数字,在给定情况下只有那些实数(非复数)整数才有可能。

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

解决方案 12:

如果您想检查字符串是否仅由数字组成,但转换为整数无济于事,您可以随时使用正则表达式。

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)时。

解决方案 13:

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

解决方案 14:

为什么不直接检查您想要检查的值是否等于其自身并将其转换为整数,如下所示?

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

解决方案 15:

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

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    

解决方案 16:

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

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

解决方案 17:

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

isinstance(var, numbers.Integral)

.. (慢)或 ..

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

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

longPY3 下降)

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

var & 0 == 0 

寻找真值和非异常可能是一个不错的选择。类似地,仅检查有符号整数类型

var ^ -1 ==  -var - 1

解决方案 18:

如果变量以字符串形式输入(例如'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)),但代码更长。我想知道资源使用或速度是否有差异。

解决方案 19:

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

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

解决方案 20:

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

operator.index用于列表索引等。并且在我看来它应该用于更多/推广。

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

这就是__index__介绍的内容!

解决方案 21:

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

解决方案 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:

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

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

为了判断数字是否为整数,我将用户输入的平方根得到的浮点数转换为四舍五入的整数(存储为值),如果这两个数字相等,则第一个数字一定是整数,这样程序才能做出响应。这可能不是最快捷的方法,但对我来说很有效。

解决方案 24:

你可以做到。

if type(x) is int:

解决方案 25:

#!/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)

解决方案 26:

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

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

解决方案 27:

如果你想编写兼容 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

解决方案 28:

一种更通用的方法是尝试检查整数和以字符串形式给出的整数

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

解决方案 29:

你可以通过以下方式做到这一点:

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

它将返回“这有效”...但如果您将名称更改为 int(1),那么它将返回“这无效”,因为它现在是一个字符串......您也可以尝试:

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"
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用