3

两个功能:

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")

有什么不同?哪个更好?

4

4 回答 4

3

第二个实际上有效(因为它不会在不可强制转换为 int 的东西上出错),但这真的取决于你想要做什么。如果你在纯 Python 中工作,最好的办法是鸭子类型 - 像这样的函数是对 check 的轻微调整,它将检查某个东西是否是一个整数值(因此,例如,它可以与2.0and一起使用2,但不是'2'但不是错误输出:

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/except 中,如上所示)。

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

def check4(n):
    if isinstance(n, (int, numbers.Integral)):
        print("n is an int")
    else:
        print("n is not an int")

顺便说一句,check4check3慢得多,因为在抽象基类上检查实例的查找涉及一些处理。

于 2013-11-07T02:47:35.310 回答
2

你的第一种方法,if int(n) != n不是一个好主意。如果n不是字符串或数字,则转换为int将失败并出现异常:

>>> class Foo(object):
>>>    pass
>>> f = Foo()
>>> int(f)
TypeError: int() argument must be a string or a number, not 'Foo'

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

if  isinstance(n, (int,long)):
    print 'n is an integer type'
else:
    print 'n is not an integer type'

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

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

于 2013-11-07T02:45:55.610 回答
2

主要区别在于,如果输入不是原始数据,则将输入转换为将失败,并且仅当输入类型属于或源自它时才会为 True。intisinstanceint因此,最好与check2. 检查以下示例运行。

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([])

输出

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
于 2013-11-07T02:50:41.980 回答
1

回覆。问题的第一部分,两个函数分别回答不同的问题。check正在查看的数值n和(某种)确定它是否有小数部分。 check2正在查看类型并确定是否n为整数。

  • check使整数等价于n,然后将其与 进行比较n。所以int(1.0)==1.0是真的,因为int(1.0)==1,但是 int("1")=="1" 是假的,因为int("1")==1.

  • check2不进行任何转换,而只是检查类型n是什么。

于 2013-11-07T02:53:17.860 回答