如何检查一个变量是否为整数?
当一个基本、有效,而且我相信平凡的问题被问出来时,看到如此激烈的讨论确实令人惊讶。
有些人指出,对int
(和long
)进行类型检查可能会漏掉遇到大十进制数字的情况。非常正确。
有些人指出,你应该“只需执行x + 1
并查看是否失败”。好吧,首先,这也适用于浮点数。另一方面,很容易构造一个明显不是非常数值化的类,但以某种方式定义了+
运算符。
我与很多强烈声明您不应检查类型的帖子意见不合。GvR曾经说过,在纯理论上,这可能是正确的,但在实践中,isinstance
经常起到有用的作用(这是一段时间前的话语,没有链接;您可以在像这样的帖子中阅读GvR关于相关问题的观点)。
有趣的是,有多少人似乎认为OP的意图是检查给定x
的类型是否为数值整数类型——我理解的是我通常使用OP的话语时所指的:是否x
代表整数。这可能非常重要:就像问别人他们想要拿多少个物品一样,您可能需要检查您得到一个非负整数。
在我看来,重要的是要看到(1)类型检查只是程序正确性的一种措施——而且通常是相当粗略的措施,因为(2)有时有界值是有意义的,越界值是无意义的。有时候只有一些间歇值是有意义的——比如考虑所有数字,只有实数(非复数)、整数可能在某种情况下是可行的。
很有趣,似乎没有人提到检查 x == math.floor(x)
。如果使用某些大十进制类时会出错,那么也许是时候重新思考面向对象编程范例了。此外,还有PEP 357,它考虑如何将不太明显但肯定像整数的值用作列表索引。不确定我是否喜欢解决方案。
x==math.floor(x)
或 x == int(x)
来引发异常,然后将其视为“无”。但其他用例涉及希望尽早获得更清晰的异常,而不是在非整数参数不合理时稍后获得更令人困惑的异常。我们针对不同的用例提供了各种答案。 - greggo如果您想检查一个字符串是否只由数字组成,但将其转换为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"
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)
,但正如本页面其他地方指出的那样,这种方法并不好。 - Thijs van Diendef isInt(val):
return val == int(val)
val
的值为例如'a'
,则需要用try/except
块来封装(或替换)测试,否则会抛出异常。 - MestreLionreturn val == int(val)
,并且需要异常块,正如MestreLion所提到的。 - jpmc26检查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")
这里有一个简单的例子,展示如何确定一个整数:
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
在使用numpy时,可以像这样进行检查..
isinstance(var, numbers.Integral)
.. (slow) or ..
isinstance(var, (int, long, np.integer))
np.int8
,np.uint16
等...
(在PY3中删除long
)
识别来自任何地方的任何类似整数的对象是一个棘手的猜测游戏。检查
var & 0 == 0
对于真实和无异常可能是一个不错的选择。同样地,专门检查有符号整数类型:
var ^ -1 == -var - 1
如果您正在从文件中读取数据,并且有一个包含多种数据类型值的数组或字典,以下内容将很有用。只需检查变量是否可以强制转换为int(或任何其他您想要强制执行的数据类型)。
try :
int(a);
#Variable a is int
except ValueError :
# Variable a is not an int
'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))
来解决问题,但那段代码较长。我想知道是否有任何资源使用或速度上的差异。
一个简单的方法是直接检查除以1的余数是否为0。
if this_variable % 1 == 0:
list.append(this_variable)
else:
print 'Not an Integer!'
使用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')
type
是解决这个问题的正确方式,但这(几乎肯定)不是正确的方式。 - Katriel