原始类型在一段时间内不起作用 lopp [重复]
原文标题 :Primitive types don’t work in a while lopp [duplicate]
如何检查变量是否为整数?
回复
我来回复-
Katriel 评论
该回答已被采纳!
如果您需要这样做,请执行
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 的强多态性:您应该允许任何行为类似于 an
int
的对象,而不是强制它是一个。但
然而,经典的 Python 心态是请求宽恕比请求许可更容易。也就是说,不要检查
x
是否为整数;假设它是,如果不是,则捕获异常结果:try: x += 1 except TypeError: ...
这种心态正逐渐被抽象基类的使用所取代,它允许您通过使其从特殊构造的类继承来准确地注册您的对象应该具有的属性(加法?乘法?加倍?)。那将是最好的解决方案,因为它将允许那些具有必要和足够属性的对象,但您必须阅读有关如何使用它的文档。
2年前 -
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年前 -
endolith 评论
以下是此处提到的不同方法的摘要:
- int(x) == x
- 试试 x = operator.index(x)
- 实例(x,int)
- isinstance(x, numbers.Integral)
以下是它们如何应用于具有整数值的各种数值类型:
你可以看到它们不是 100% 一致的。 Fraction 和 Rational 在概念上是相同的,但是一个提供一个
.index()
方法,另一个不提供。复杂类型不喜欢转换为 int,即使实部是整数而虚部是 0。(
np.int8|16|32|64(5)
表示np.int8(5)
、np.int32(5)
等都表现相同)2年前 -
Scott Griffiths 评论
如果你真的需要检查,那么最好使用抽象基类而不是具体类。对于一个整数,这意味着:
>>> import numbers >>> isinstance(3, numbers.Integral) True
这不会将检查限制为仅
int
,或仅int
和long
,还允许其他表现为整数的用户定义类型工作。2年前 -
Matt Joiner 评论
>>> isinstance(3, int) True
请参阅此处了解更多信息。
请注意,如果您正在寻找类似
int
的属性,这将无济于事。在这种情况下,您可能还需要检查long
:>>> isinstance(3L, (long, int)) True
我已经在 Python 源代码中看到了针对数组/索引类型的这种检查,但我认为这在 C 之外是不可见的。
Token SO回复:你确定你应该检查它的类型吗?要么不要传递你无法处理的类型,要么不要试图超越潜在的代码重用者,他们可能有充分的理由不将 int 传递给你的函数。
2年前 -
Parsa 评论
为什么不尝试类似的东西:
if x%1 == 0:
2年前 -
Dairy Window 评论
与其把事情复杂化,不如做一个简单的
if type(var) is int:
2年前 -
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年前 -
Jungle Hunter 评论
在 SO 本身上找到了一个相关的问题。
Python 开发人员更喜欢不检查类型,而是执行特定类型的操作并捕获
TypeError
异常。但是,如果您不知道类型,那么您有以下内容。>>> i = 12345 >>> type(i) <type 'int'> >>> type(i) is int True
2年前 -
flow 评论
当这样一个基本的、有效的并且我相信是平凡的问题被提出时,看到如此激烈的讨论真的令人震惊。
有些人指出,针对
int
(和long
)的类型检查可能会丢失遇到大十进制数的情况。非常正确。有些人指出,你应该’只是做
x + 1
,看看是否失败。好吧,一方面,这也适用于浮点数,另一方面,很容易构造一个绝对不是非常数字的类,但以某种方式定义了+
运算符。我与许多强烈声明您不应该检查类型的帖子不一致。好吧,GvR 曾经说过,在纯理论中,这可能是正确的,但在实践中,
isinstance
通常有一个有用的目的(那是前一段时间,没有链接;你可以阅读 GvR 所说的相关像这样的问题inposts)。有趣的是,有多少人似乎认为 OP 的意图是检查给定
x
的类型是否是数字整数类型——我理解的是我在使用 OP 的话时通常的意思:是否x
表示整数。这可能非常重要:比如询问某人他们想要挑选多少物品,您可能想要检查您是否得到一个非负整数。像这样的用例比比皆是。在我看来,看到 (1) 类型检查只是程序正确性的一个——而且通常是相当粗略的——衡量也是很重要的,因为 (2) 它通常是有意义的有界值和越界值那是胡说八道。有时只是一些间歇性的值是有意义的——比如考虑所有数字,在给定的情况下,只有那些实数(非复数)整数可能是可能的。
有趣的非一个似乎提到检查
x == math.floor( x )
。如果这会给一些大的十进制类带来错误,那么也许是时候重新考虑 OOP 范式了。还有 PEP 357 考虑如何使用不那么明显-int
-但肯定是整数的值用作列表索引。不确定我是否喜欢这个解决方案。2年前 -
Fariman Kashani 评论
也可以用
str.isdigit
。试着抬头看help(str.isdigit)
def is_digit(str): return str.isdigit()
2年前 -
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年前 -
NotNamedDwayne 评论
为什么不检查您要检查的值是否等于其自身转换为整数,如下所示?
def isInt(val): return val == int(val)
2年前 -
kxr 评论
在存在 numpycheck 之类的..
isinstance(var, numbers.Integral)
..(慢)或..
isinstance(var, (int, long, np.integer))
..为了匹配所有类型变体,如
np.int8
,np.uint16
,…(下降
long
in PY3)从任何地方识别任何类似整数的对象都是一个棘手的猜谜游戏。检查
var & 0 == 0
因为真理和无例外可能是一个不错的选择。同样,专门检查有符号整数类型:
var ^ -1 == -var - 1
2年前 -
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年前 -
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年前 -
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年前 -
seberg 评论
如果您只需要值,
operator.index
(__index__
特殊方法)在我看来是要走的路。因为它应该适用于所有可以安全地转换为整数的类型。即。浮点数失败,整数,甚至花哨的整数类都可以不要通过鸭子类型来实现 Integral 抽象类的工作。operator.index
用于列表索引等。在我看来,它应该用于更多/提升。事实上,我认为这是获取整数值的唯一正确方法,如果你想确定浮点数,由于截断问题等。被拒绝并且它适用于所有整数类型(即。numpy等)甚至如果他们可能(还)不支持抽象类。
这就是
__index__
被介绍的原因!2年前 -
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年前 -
hiteshn97 评论
一个简单的方法是直接检查除以 1 的余数是否为 0。
if this_variable % 1 == 0: list.append(this_variable) else: print 'Not an Integer!'
2年前