两个功能:
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")
有什么不同?哪个更好?
两个功能:
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")
有什么不同?哪个更好?
第二个实际上有效(因为它不会在不可强制转换为 int 的东西上出错),但这真的取决于你想要做什么。如果你在纯 Python 中工作,最好的办法是鸭子类型 - 像这样的函数是对 check 的轻微调整,它将检查某个东西是否是一个整数值(因此,例如,它可以与2.0
and一起使用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
(1
例如,你有一个 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")
顺便说一句,check4
它比check3慢得多,因为在抽象基类上检查实例的查找涉及一些处理。
你的第一种方法,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
。
此代码根本不处理浮点值。您尚未向我们提供有关如何使用此代码的任何信息,因此您必须正确处理所有情况。
主要区别在于,如果输入不是原始数据,则将输入转换为将失败,并且仅当输入类型属于或源自它时才会为 True。int
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([])
输出
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
回覆。问题的第一部分,两个函数分别回答不同的问题。check
正在查看的数值n
和(某种)确定它是否有小数部分。 check2
正在查看类型并确定是否n
为整数。
check
使整数等价于n
,然后将其与 进行比较n
。所以int(1.0)==1.0
是真的,因为int(1.0)==1
,但是 int("1")=="1" 是假的,因为int("1")==1
.
check2
不进行任何转换,而只是检查类型n
是什么。