5.6 内建函数与工厂函数

5.6.1 标准类型函数

第4章中,我们介绍了 cmp()、str()和type()内建函数。这些函数可以用于所有的标准类型。对数字对象来说,这些函数分别比较两个数的大小,将数字转换为字符串,以及返回数字对象的类型。

5.6 内建函数与工厂函数 - 图1

5.6.2 数字类型函数

Python现在拥有一系列针对数字类型的内建函数。一些函数用于数字类型转换,另一些则执行一些常用运算。

1.转换工厂函数

函数int()、long()、float()和complex()用来将其他数值类型转换为相应的数值类型。从Python 1.5版本开始,这些函数也接受字符串参数,返回字符串所表示的数值。从Python 1.6版开始,int()和long()在转换字符串时,接受一个进制参数。如果是数字类型之间的转换,则这个进制参数不能使用。

从Pythori2.2起,有了第5个内建函数bool()。它用来将整型值1和0转换为标准布尔值True和 Falseo从Python2.3开始,Python的标准数据类型添加了一个新成员:布尔(Boolean)类型。从此true和false。现在有了常量值即True和False (不再是1和0)。要了解布尔类型的更多信息,参阅5.7.1小节。

另外,由于Python 2.2对类型和类进行了整合(这里指Python的传统风格类和新风格类一译者注),所有这些内建函数现在都转变为工厂函数。我们曾经在第4章介绍过工厂函数,所谓工厂函数就是指这些内建函数都是类对象,当你调用它们时,实际上是创建了一个类实例。

不过不用担心,这些函数的使用方法并没有什么改变。

下面是一些使用内建函数的示例。

5.6 内建函数与工厂函数 - 图2

表5.5是数值工厂函数总结。

5.6 内建函数与工厂函数 - 图3

2.功能函数

Python有 5个运算内建函数用于数值运算:abs()、coerce()、divmod()、pow()、pow()和 round()。我们将对这些函数逐一浏览,并给出一些有用的例子。

abs()返回给定参数的绝对值。如果参数是一个复数,那么就返回math.sqrt(num.real2 + num.imag2)。下面是几个abs()函数的示例。

5.6 内建函数与工厂函数 - 图4

5.6 内建函数与工厂函数 - 图5

函数coerce(),尽管从技术上讲它是一个数据类型转换函数,不过它的行为更像一个操作符,因此我将它放到了这一小节。在5.5.1小节,我们讨论了 Python如何执行数值类型转换。函数coerce ()为程序员提供了不依赖Python解释器,而是自定义两个数值类型转换的方法。对一种新创建的数值类型来说,这个特性非常有用。函数coerce()仅返回一个包含类型转换完毕的两个数值元素的元组。下面是几个例子。

5.6 内建函数与工厂函数 - 图6

divmod()内建函数把除法和取余运算结合起来,返回一个包含商和余数的元组。对整型来说,它的返回值就是地板除和取余操作的结果。对浮点型来说,返回的商部分是math.floor (num1/num2),对复数来说,商部分是 ath.floor((numl/num2).real)。

5.6 内建函数与工厂函数 - 图7

函数pow()和双星号(**)操作符都可以进行指数运算。不过二者的区别并不仅仅在于一个是操作符,一个是内建函数。

在Python 1.5之前,并没有**操作符。内建函数pow()还接受第三个可选的参数,即一个余数参数。如果有这个参数的,pow()先进行指数运算,然后将运算结果和第三个参数进行取余运算。这个特性主要用于密码运算,并且比pow(x,y) % z性能更好,这是因为这个函数的实现类似于C函数pow(x,y,z)。

5.6 内建函数与工厂函数 - 图8

5.6 内建函数与工厂函数 - 图9

内建函数mund()用于对浮点型进行四舍五入运算。它有一个可选的小数位数参数。如果不提供小数位参数,它返回与第一个参数最接近的整型(但仍然是浮点类型)。第二个参数告诉round函数将结果精确到小数点后指定位数。

5.6 内建函数与工厂函数 - 图10

值得注意的是round()函数是按四舍五入的规则进行取整。也就是round (0.5)得到1, round (-0.5)得到−1。猛一看int()、round()、 math.floor()这几个函数好像做的是同一件事,很容易将它们弄混,是不是?下面列出它们之间的不同之处。

  • 函数int()直接截去小数部分(返回值为整型)。

  • 函数floor()得到最接近原数但小于原数的整型(返回值为浮点型)。

  • 函数round()得到最接近原数的整型(返回值为浮点型)。

下面的例子用4个正数和4个负数作为这三个函数的参数,将返回结果列在一起做个比较(为了便于比较我们将int()函数的返回值也转换成了浮点型)。

5.6 内建函数与工厂函数 - 图11

表5.6是数值运算函数一览。

5.6 内建函数与工厂函数 - 图12

5.6 内建函数与工厂函数 - 图13

5.6.3 仅用于整型的函数

除了适应于所有数值类型的内建函数之外,Python还提供一些仅适用于整型的内建函数(标准整型和长整型)。这些函数分为两类,一类用于进制转换,另一类用于ASCII转换。

1.进制转换函数

前面我们已经看到,除了十进制标准,Python整型也支持八进制和十六进制整型。除此之外,Python还提供了两个内建函数来返回字符串表示的八进制和十六进制整型,它们分别是oct()和hex()。它们都接受一个整型(任意进制的)对象,并返回一个对应值的字符串对象。下面是几个示例。

5.6 内建函数与工厂函数 - 图14

  1. ASCII转换函数

Python也提供了 ASCII (美国标准信息交换码)码与其序列值之间的转换函数。每个字符对应一个唯一的整型(0〜255)。对所有使用ASCII表的计算机来说,这个数值是不变的。这保证了不同系统之间程序行为的一致性。函数chr()接受一个单字节整型值,返回一个字符串,其值为对应的字符。函数ord()则相反,它接受一个字符,返回其对应的整型值。

5.6 内建函数与工厂函数 - 图15

5.6 内建函数与工厂函数 - 图16

表5.7列出了用于整型类型的所有内建函数。

5.6 内建函数与工厂函数 - 图17