检查变量是否为整数[重复]
- 2024-12-23 08:43:00
- admin 原创
- 83
问题描述:
如何检查变量是否是整数?
解决方案 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)
以下是它们如何应用于具有整数值的各种数值类型:
您可以看到它们并非 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
,,...
(long
PY3 下降)
识别任何地方的任何整数类对象都是一个棘手的猜谜游戏。检查
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"
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)