Kat*_*iel 1002
如果你需要这样做,那就做吧
isinstance(<var>, int)
Run Code Online (Sandbox Code Playgroud)
除非您在Python 2.x中,否则您需要
isinstance(<var>, (int, long))
Run Code Online (Sandbox Code Playgroud)
不要用type.它几乎从来都不是Python中的正确答案,因为它阻止了多态性的所有灵活性.例如,如果你是子类int,你的新类应该注册为int,而type不会:
class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True
Run Code Online (Sandbox Code Playgroud)
这符合Python强大的多态性:你应该允许任何行为类似的对象int,而不是强制它是一个.
然而,经典的Python心态是,请求宽恕比获得更容易.换句话说,不要检查是否x是整数; 假设它是并且如果不是,则捕获异常结果:
try:
x += 1
except TypeError:
...
Run Code Online (Sandbox Code Playgroud)
这种心态是慢慢地被使用超越抽象基类,这让你注册什么性质的对象应该具有通过使从特殊构造的类继承(添加?乘?翻一番?).这将是最好的解决办法,因为这将允许确切必要的和足够的属性的对象,但你必须阅读有关如何使用它的文档.
sar*_*ele 97
到目前为止,所有提出的答案似乎都错过了一个事实:double(python中的浮点数实际上是双精度数)也可以是一个整数(如果它在小数点后面没有任何内容).我is_integer()在双打上使用内置方法来检查这个.
示例(在for循环中每隔x次执行一次操作):
for index in range(y):
# do something
if (index/x.).is_integer():
# do something special
Run Code Online (Sandbox Code Playgroud)
编辑:
在调用此方法之前,您始终可以转换为浮点数.三种可能性:
>>> float(5).is_integer()
True
>>> float(5.1).is_integer()
False
>>> float(5.0).is_integer()
True
Run Code Online (Sandbox Code Playgroud)
否则,你可以像Agostino一样检查它是否是一个int:
def is_int(val):
if type(val) == int:
return True
else:
if val.is_integer():
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
Sco*_*ths 65
如果你真的需要检查那么最好使用抽象基类而不是具体类.对于一个整数,意味着:
>>> import numbers
>>> isinstance(3, numbers.Integral)
True
Run Code Online (Sandbox Code Playgroud)
这不限制的检查只int,或者只是int和long,但也允许表现为整数工作的其他用户定义类型.
end*_*ith 63
以下是此处提到的不同方法的摘要:
int(x) == xtry 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)等所有的行为相同)
Mat*_*ner 37
>>> isinstance(3, int)
True
Run Code Online (Sandbox Code Playgroud)
请看这里了解更多.
请注意,如果您正在寻找int类似属性,这无济于事.在这种情况下,您可能还想检查long:
>>> isinstance(3L, (long, int))
True
Run Code Online (Sandbox Code Playgroud)
我已经在Python源代码中看到了这种针对数组/索引类型的检查,但我不认为在C之外可见.
Token SO回复:你确定你应该检查它的类型吗?要么不通过一种你无法处理,或者不要试图智取你的潜在的代码重用者,他们可能有一个很好的理由不为int传递给你的函数.
Par*_*rsa 19
为什么不尝试类似的东西:
if x%1 == 0:
Run Code Online (Sandbox Code Playgroud)
Dai*_*dow 18
而不是复杂的事情,为什么不简单
if type(var) is int:
Run Code Online (Sandbox Code Playgroud)
小智 13
我在我的所有软件中使用的一种简单方法就是这样.它检查变量是否由数字组成.
test = input("Enter some text here: ")
if test.isdigit() == True:
print("This is a number.")
else:
print("This is not a number.")
Run Code Online (Sandbox Code Playgroud)
flo*_*low 12
当这样一个基本的,有效的,我相信的平凡问题被提出时,看到如此热烈的讨论,真是令人震惊.
有些人指出,针对int(和long)的类型检查可能会丢失遇到大十进制数的情况.完全正确.
有些人指出你应该'做x + 1,看看是否失败了.好吧,首先,这也适用于浮点数,而另一方面,很容易构造一个绝对不是很数字的类,但+以某种方式定义运算符.
我很多帖子都大力宣称你不应该检查类型.好吧,GvR曾经说过这样的结论:在纯理论中,这可能是正确的,但在实践中,isinstance往往是有用的目的(不久之前,没有链接;你可以阅读GvR关于相关问题的说法)在像这样的帖子中).
有趣的是,有多少人似乎认为OP的意图是检查给定的类型是否x是数字整数类型 - 我所理解的是我在使用OP的单词时通常的意思:是否x表示整数.这可能非常重要:比如告诉别人他们想要选择多少项,你可能想要检查一下你得到一个非负整数.像这样的用例比比皆是.
在我看来,重要的是要看到(1)类型检查只是一个 - 并且通常非常粗略地衡量程序的正确性,因为(2)它通常是有意义的有意义的值,并且超出范围的值这让人胡说八道.有时只是一些间歇性的值有意义 - 考虑到所有数字,在给定的情况下,只有那些真实的(非复杂的)整数才有可能.
有趣的非人似乎提到检查x == math.floor( x ).如果那应该给出一些大的十进制类错误,那么也许是时候重新思考OOP范式了.还有PEP 357考虑如何使用不那么明显int但肯定是整数的值作为列表索引.不确定我是否喜欢这个解决方案.
在这里找到一个关于SO本身的相关问题.
Python开发人员更喜欢不检查类型,而是执行特定于类型的操作并捕获TypeError异常.但如果您不知道该类型,那么您有以下内容.
>>> i = 12345
>>> type(i)
<type 'int'>
>>> type(i) is int
True
Run Code Online (Sandbox Code Playgroud)
小智 8
在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")
Run Code Online (Sandbox Code Playgroud)
为什么不检查您要检查的值是否等于自身强制转换为整数,如下所示?
def isInt(val):
return val == int(val)
Run Code Online (Sandbox Code Playgroud)
小智 7
如果你想检查一个字符串只包含数字,但转换为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"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果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"
Run Code Online (Sandbox Code Playgroud)
这实际上显示了在不使用异常的情况下问题发生的位置.同样,这不是用于测试类型,而是用于测试字符本身.这比简单地检查类型提供了更多的灵活性,尤其是在类型之间进行转换时可能会丢失重要的字符串数据,例如前导0.
在numpy检查的情况下,例如 ..
isinstance(var, numbers.Integral)
Run Code Online (Sandbox Code Playgroud)
..(慢)或..
isinstance(var, (int, long, np.integer))
Run Code Online (Sandbox Code Playgroud)
.. 为了匹配所有类型变体,如np.int8, np.uint16, ...
(long在 PY3 中下降)
从任何地方识别任何类似整数的对象是一个棘手的猜谜游戏。检查
var & 0 == 0
Run Code Online (Sandbox Code Playgroud)
因为真理和非例外可能是一个不错的选择。同样,专门检查有符号整数类型:
var ^ -1 == -var - 1
Run Code Online (Sandbox Code Playgroud)
这是一个如何确定整数的简单示例
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
Run Code Online (Sandbox Code Playgroud)
如果您正在从文件中读取数据,并且有一个包含多种数据类型值的数组或字典,则以下内容将很有用。只需检查变量是否可以类型转换为 int(或您想要强制执行的任何其他数据类型)。
try :
int(a);
#Variable a is int
except ValueError :
# Variable a is not an int
Run Code Online (Sandbox Code Playgroud)
您也可以使用str.isdigit。尝试向上看help(str.isdigit)
def is_digit(str):
return str.isdigit()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1181151 次 |
| 最近记录: |