本文基于python3.11,落后版本的方法可能有所不同,tuple(元组)、int(整型)和float(浮点型)都是不可变对象,无法修改它们的值,且它们都是可哈希的,既然是不可变对象,那么它们的内置方法是不可能修改对象本身的,因此都不是修改器(原则上来说,我们在编程的过程中,应该尽量保证所有的函数都是纯函数,对传入的对象进行修改可能造成无法察觉的bug,当然这个原则不适用于实例方法,修改实例本身的方法是随处可见的)
tuple的count(value)和index(value, start, stop)和list的同名方法的作用完全相同(注意stop不包含stop索引本身即可)
int和float有两个同名方法,as_interger_ratio()方法是返回字面量与1的比值,比如100会返回(100, 1)(我暂时还不知道该方法的应用场景),conjugate()对于实数而言也是无用的方法,就是返回本身,但调用内置方法complex(real, imag)可以创建一个复数类,其conjugate()方法可以返回它的共轭复数,且real和imag可以是float类型
int有两个关于二进制的方法,bit_length()方法返回这个整数的二进制数长度(负数与其绝对值的返回值一样,值得一提的是,python中的int类型是无限长整数,而负数是通过正数补码实现,这也就导致负数的最高位1在无限长处,这里的实现原理我也不太清楚,对负数调用bin()内置方法会得到一个带符号的二进制数,而不是无限长的一个二进制数),bit_conut()方法必须等于高于3.10版本才能使用,其返回这个整数的二进制数中1的个数,非常反直觉的是,对负数应用该方法仍然得到的是其绝对值的值(个人猜测是为了方便用户查看),以下给出验证python中负数是无限长二进制数的代码:
i = -1
while i != 0:
i >>= 1
# 执行该代码会陷入无限循环,说明负数永远无法右移至0
int还有两个关于bytes类型的方法,以后写关于str的内置方法时再细讲
float类型还有两个方法分别是hex()和fromhex(),看到from我们就可以猜测这是不是一个构造函数,这里确实是,hex()是获取float的十六进制表示,fromhex()自然就是由一个十六进制数获得对应float的实例,注意在任何语言中float类型都是无法准确表示的,即使0.1这样一个简单的浮点数,计算机也不可能准确表示,我们都知道计算机是通过二进制来工作的,0.1的二进制表示是无穷长的,但0.5=2^(-1)、0.75=2^(-1)+2^(-2)是可以准确表示的
print(0.1 - 0.01) # 0.09000000000000001
print(0.5 - 0.75) # -0.25
# 第一个式子出现了精度问题,在进行不能精确表示的浮点数之间的运算时经常可能出现这种误差
# 平时基本可以忽略,但在科学计算软件中这是一个非常重要的问题