trunc
和 int
函数为我尝试过的每个浮点类型输入返回相同的输出。
它们的不同之处在于
int
也可用于将数字字符串转换为整数。
所以我有两个问题:
我想知道,除了字符串之外,是否有任何输入
trunc
和 int
会给出不同的输出?如果没有,什么时候使用
trunc
将浮点型数字转换为整数更好?int
和 math.trunc
与 str
和 repr
的关系有些类似。 int
委托给类型的 __int__
方法,如果未找到 __trunc__
,则回退到
__int__
方法。 math.trunc
直接委托给类型的 __trunc__
方法并且没有后备。与始终为 __str__
定义的
__repr__
和
object
不同,int
和 math.trunc
都可能引发开箱即用的错误。
对于我所知道的所有内置类型,
__int__
和 __trunc__
都是在适当的情况下合理定义的。但是,您可以定义自己的一组测试类来查看收到的错误:
class A:
def __int__(self):
return 1
class B:
def __trunc__(self):
return 1
class C(): pass
math.trunc(A())
和 math.trunc(C())
都会提高 TypeError: type X doesn't define __trunc__ method
。 int(C())
会升高 TypeError: int() argument must be a string, a bytes-like object or a number, not 'C'
。然而,int(A())
、int(B())
和math.trunc(B())
都会成功。
最终决定使用哪种方法是内涵之一。
trunc
本质上是类似于floor
的数学运算,而int
是通用转换,并且在更多情况下成功。换句话说,int
可以尝试将字符串之类的东西转换为整数,而trunc
适用于floats
,它已经有明确定义的整数部分。
operator.index
和 __index__
方法。
math.trunc()
比 int()
快约 10%;至少在我的电脑配置上。