原始类型在一段时间内不起作用 lopp [重复]

扎眼的阳光 python 386

原文标题Primitive types don’t work in a while lopp [duplicate]

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

原文链接:https://stackoverflow.com//questions/71462411/primitive-types-dont-work-in-a-while-lopp

回复

我来回复
  • Katriel的头像
    Katriel 评论

    如果您需要这样做,请执行

    isinstance(<var>, int)
    

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

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

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

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

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

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

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

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

    2年前 0条评论
  • saroele的头像
    saroele 评论

    到目前为止,所有提出的答案似乎都忽略了一个事实,即双精度数(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
    
    2年前 0条评论
  • endolith的头像
    endolith 评论

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

    • int(x) == x
    • 试试 x = operator.index(x)
    • 实例(x,int)
    • isinstance(x, numbers.Integral)

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

    Table of methods for checking whether Python numerical types are integers

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

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

    2年前 0条评论
  • Scott Griffiths的头像
    Scott Griffiths 评论

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

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

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

    2年前 0条评论
  • Matt Joiner的头像
    Matt Joiner 评论
    >>> isinstance(3, int)
    True
    

    请参阅此处了解更多信息。

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

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

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

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

    2年前 0条评论
  • Parsa的头像
    Parsa 评论

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

    if x%1 == 0: 
    
    2年前 0条评论
  • Dairy Window的头像
    Dairy Window 评论

    与其把事情复杂化,不如做一个简单的

    if type(var) is int:
    
    2年前 0条评论
  • Resin Drake的头像
    Resin Drake 评论

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

    test = input("Enter some text here: ")
    if test.isdigit() == True:
       print("This is a number.")
    else:
       print("This is not a number.")
    
    2年前 0条评论
  • Jungle Hunter的头像
    Jungle Hunter 评论

    在 SO 本身上找到了一个相关的问题。

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

    >>> i = 12345
    >>> type(i)
    <type 'int'>
    >>> type(i) is int
    True
    
    2年前 0条评论
  • flow的头像
    flow 评论

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

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

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

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

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

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

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

    2年前 0条评论
  • Fariman Kashani的头像
    Fariman Kashani 评论

    也可以用str.isdigit。试着抬头看help(str.isdigit)

    def is_digit(str):
          return str.isdigit()
    
    2年前 0条评论
  • sudokode的头像
    sudokode 评论

    如果您想检查字符串是否仅包含数字,但转换为 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。

    2年前 0条评论
  • NotNamedDwayne的头像
    NotNamedDwayne 评论

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

    def isInt(val):
        return val == int(val)
    
    2年前 0条评论
  • kxr的头像
    kxr 评论

    在存在 numpycheck 之类的..

    isinstance(var, numbers.Integral)
    

    ..(慢)或..

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

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

    (下降longin PY3)

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

    var & 0 == 0 
    

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

    var ^ -1 ==  -var - 1
    
    2年前 0条评论
  • premvardhan的头像
    premvardhan 评论

    签入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")
    
    2年前 0条评论
  • Ramon Suarez的头像
    Ramon Suarez 评论

    如果变量像字符串一样输入(例如'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)),但它是更长的代码。我想知道在资源使用或速度方面是否有任何差异。

    2年前 0条评论
  • PradeepNama的头像
    PradeepNama 评论

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

    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    
    
    2年前 0条评论
  • seberg的头像
    seberg 评论

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

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

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

    这就是__index__被介绍的原因!

    2年前 0条评论
  • Nick T的头像
    Nick T 评论

    如果您想检查而不考虑 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)
    
    2年前 0条评论
  • hiteshn97的头像
    hiteshn97 评论

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

    if this_variable % 1 == 0:
        list.append(this_variable)
    else:
        print 'Not an Integer!'
    
    2年前 0条评论