两个功能:
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")
有什么区别?哪一个更好?
答案 0 :(得分:3)
第二个实际上是有效的(因为它不会对不能强制转换为int的东西出错),但它实际上取决于你想要做什么。如果你使用的是纯Python,那么最好的做法就是鸭子类型 - 像这样的函数是一个微小的调整检查,它将检查某些东西是否是一个整数值(例如,它将与{{1一起使用)还有2.0
,但不是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.0
之间的区别很重要(例如,你有一个int64 ndarray),那么你想要使用你的实例检查1
,因为它会让你知道完全是一个int。
归结为这个问题:它必须是一个int还是 act 就像一个整数?如果它必须是一个int,那么使用check2,如果它必须 act 就像一个int,使用check(但可能会修改它在try /中,如上所示)。
另一个选择是利用抽象基类来允许int-like(例如,numpy int dtypes是整数,但实际上不是int的子类),使用抽象基类check2
numbers.Integral
另外,def check4(n):
if isinstance(n, (int, numbers.Integral)):
print("n is an int")
else:
print("n is not an int")
比 check3 慢 ,因为查询抽象基类的实例检查涉及一些处理。
答案 1 :(得分: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
或 long
。那是因为isinstance(0xDEADBEEF2B84F00D, int) == False
。
此代码根本不处理浮点值。您尚未向我们提供有关如何使用此代码的任何信息,因此您可以正确处理所有情况。
答案 2 :(得分:2)
主要区别是如果输入不是原始数据,则将输入转换为int
将失败,并且只有当输入类型为{{1时} isinstance
才为真或者从中获取。因此,最好使用int
。检查以下样本运行。
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([])
答案 3 :(得分: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
的类型。