如何检查一个变量是否为整数?
如果你需要这样做,那么就这样做
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:
...
使用抽象基类逐渐取代了这种思维方式,抽象基类可以让你通过让对象继承一个特别构建的类来注册对象应该具有的属性(例如添加?乘法?倍增?)。这是最好的解决方案,因为它将允许仅具有必要和充分属性的对象,但您需要阅读文档以了解如何使用。
int
/long
问题就是一个很好的例子;如果有人有自定义的 short
类型呢?它与 int
和数据库兼容,但如果检查类型,则您的代码将无法接受它。 - jpmc26isinstance(True, int)
返回True吗? - Nagriint
的子类 =),这是Python的设计决定。这意味着布尔值就像整数一样,并且任何对象都可以作为布尔值进行评估。 - Katrielsympy.Rational
测试并没有达到你的预期,因为sympy.Rational(5)
的计算结果实际上是sympy.Integer
的实例。任何会生成整数值的有理数的运算最终都会产生整数。 - user2357112sympy.Rational
支持operator.index
,但实际上并不支持。情况是这样的,sympy
会主动切换到更具体的类型。sympy.Rational(5)
并不真正适用于表格中“有理数”一节。 - user2357112Rational(5)
甚至不存在。它会立即转换为 Integer
,而 Integer
支持 operator.index
。 - endolithRational(3, 5)
不支持.__index__()
,但是sympy.Rational(5).__index__()
会产生5,因为它立即转换为一个Integer
。 - endolith到目前为止,所有提出的答案似乎都忽略了一个事实,即双精度浮点数(在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
函数的文档链接吗?我找不到。 - Gabefloat
方法,因此它不是一个通用函数,不能应用于任何类型以确定它是否为整数。 - Craig McQueenint
(或long
),然后检查它是否为float
,如果是,则检查is_integer()
是否为真。请注意,在Python 3中没有long
类型。 - Agostinoint(x) == x
也适用于浮点数。 - endolith如果你真的需要进行检查,最好使用抽象基类而不是具体类。对于整数来说,这意味着:
>>> import numbers
>>> isinstance(3, numbers.Integral)
True
这并不仅限于检查 int
,或者只检查 int
和 long
,而是允许其他行为类似于整数的用户定义类型正常工作。
isinstance(Fraction(5,1), numbers.Integral)
→ False. 这个说法正确吗? 这句话在英文中已经非常清晰明了,我的翻译如下:isinstance(Fraction(5,1), numbers.Integral)
→ False. 这句话正确吗? - endolithtype(f)(int(f)) == f
,但我认为你也可以这样做。 - Scott Griffithsint
的子类,它可能只表示整数。一个例子就是numpy的int16
类型。现在可以承认这也没有使用ABC,但如果它想说它是一个整数类型的对象,但又不想实际上成为int
,那么它可以使用ABC。哦,等到他们制作出128位的Python版本再说吧 :) - Scott Griffiths>>> isinstance(3, int)
True
更多信息请参见此处。
请注意,如果您正在寻找类似于int
的属性,则此方法不适用。在这种情况下,您可能还需要检查long
:
>>> isinstance(3L, (long, int))
True
我在Python源代码中看到过对数组/索引类型进行此类检查,但我认为这在C之外不可见。
Token SO回复:您确定应该检查其类型吗?要么不要传递您无法处理的类型,要么不要尝试超越您的潜在代码重用者,他们可能有充分的理由不将int传递给您的函数。
为什么不试试这样的东西:
if x%1 == 0:
x
不是一个数字,比如一个字符串会怎么样? - Jason不要过于复杂,为什么不简单化呢?
if type(var) is int:
在这里发现一个相关问题。
Python开发者更喜欢不检查类型,而是执行特定于类型的操作并捕获TypeError
异常。但是如果您不知道类型,则可以使用以下方法。
>>> i = 12345
>>> type(i)
<type 'int'>
>>> type(i) is int
True
type
=p。) - Katriel我在所有的软件中都使用一个简单的方法。它检查变量是否由数字组成。
test = input("Enter some text here: ")
if test.isdigit() == True:
print("This is a number.")
else:
print("This is not a number.")
isdigit
对于负数和浮点数都返回False
: '-10'.isdigit()
和 '1.5'.isdigit()
。 - Anton Tarasenko您还可以使用str.isdigit
。请尝试查找help(str.isdigit)
def is_digit(str):
return str.isdigit()
isdigit()
对于负整数返回 False
。 - Sunny Tambi
type
是解决这个问题的正确方式,但这(几乎肯定)不是正确的方式。 - Katriel