首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(n,int)和int(n) == n

(n,int)和int(n) == n
EN

Stack Overflow用户
提问于 2013-11-07 02:43:31
回答 4查看 4.1K关注 0票数 3

两项职能:

代码语言:javascript
复制
def check(n):
    if int(n) != n:
        print("int(n) != n")
    else:
        print("int(n) == n")

代码语言:javascript
复制
def check2(n):
    if not isinstance(n, int):
        print("n is not an int")
    else:
        print("n is an int")

有什么关系呢?哪一个更好?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-07 02:50:41

主要的区别是,如果输入不是原始数据,那么将输入转换为int 的将失败,而只有当输入类型为 int 或从输入中剥离时,才是真。因此,与check2一起使用更好。检查下面的示例运行。

代码语言:javascript
复制
def check(n):
    if int(n) != n:
        print("int(n) != n")
    else:
        print("int(n) == n")

def check2(n):
    if not isinstance(n, int):
        print("n is not an int")
    else:
        print("n is an int")


class myInt(int):
    pass

check(1)
check("1")
#check({})      #Will throw error
#check([])      #Will throw error
check(myInt()) 
print ""
check2(1)
check2("1")
check2({})
check2(myInt())
check2([])

输出

代码语言:javascript
复制
int(n) == n
int(n) != n
int(n) == n

n is an int
n is not an int
n is not an int
n is an int
n is not an int
票数 2
EN

Stack Overflow用户

发布于 2013-11-07 02:47:35

第二种方法实际上是有效的(因为它不会在不可强迫的int上出错),但它实际上取决于您想要做什么。如果您使用的是纯Python,最好的做法是使用鸭子类型--像这样的函数在check上做了一个轻微的调整,它将检查某个东西是否是一个整数值(例如,它将适用于2.02,而不是'2',而不是error out):

代码语言:javascript
复制
def check3(n):
    "prints 'n is an int' if the value is integral"
    try:
        val = int(n)
        if val == n:
           print("n is an int")
    except ValueError:
        pass # return False would also work
    print("n is not an int")

相反,如果了解1.01之间的区别很重要(例如,您有一个int64 ndarray),那么您需要使用实例检查check2,因为它会让您知道它正是一个int。

它归结为这样一个问题:它是一个int,还是只是一个整数?如果它必须是一个int,那么使用check2,如果它必须像一个int,那么使用check (但是可能修改它是在try/除了上面所示的)。

另一种选择是利用抽象基类来允许int (例如,numpy int dtype是整的,但实际上不是int的子类),使用抽象基类numbers.Integral

代码语言:javascript
复制
def check4(n):
    if isinstance(n, (int, numbers.Integral)):
        print("n is an int")
    else:
        print("n is not an int")

顺便说一下,check4比check3慢得多,因为查找(例如,对抽象基类的检查)需要一些处理。

票数 3
EN

Stack Overflow用户

发布于 2013-11-07 02:45:55

您的第一个方法,if int(n) != n不是一个好主意。如果n不是字符串或数字,则向int的转换将失败,例外情况如下:

代码语言:javascript
复制
>>> class Foo(object):
>>>    pass
>>> f = Foo()
>>> int(f)
TypeError: int() argument must be a string or a number, not 'Foo'

我相信最好的方法(无论如何在Python2.x中)是:

代码语言:javascript
复制
if  isinstance(n, (int,long)):
    print 'n is an integer type'
else:
    print 'n is not an integer type'

请注意,我正在检查intlong。那是因为isinstance(0xDEADBEEF2B84F00D, int) == False

此代码根本不处理浮点值。您尚未向我们提供有关如何使用此代码的任何信息,因此应由您正确处理所有情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19827040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档