6.13 内建函数

6.13.1 标准类型函数

cmp()

在4.6.1节里,我们通过比较数字和字符串介绍了内建cmp()函数。但我们还不知道cmp()函数是如何跟其他的比如列表和元组类型合作的,这些类型不仅含有数字和字符串,而且还有列表、元组、字典之类的其他对象,甚至可以是用户自定义的对象。这种情况下cmp()函数是如何工作的呢?

6.13 内建函数 - 图1

如果我们比较的是两个同类的对象,比较操作是非常直观的。比如数字和字符串,直接比较它们的值就行了。对于序列类型,比较操作稍微有点复杂了,但是方式上有相似Python在两个对象基本不能比较的时候尽量做出公平的结果,比如当两个对象没有关系时或者两种类型根本就没有用于比较的函数,这时Python只能根据“逻辑”来做出结论。

除了这种极端的情况之外,安全而又健全的比较方法是,如果有不相等的情况出现,比较操作就结束。这种算法是如何工作的呢?像我们前面简短的提到过的,列表的元素是可以无限迭代的。如果它的元素都是相同类型,则用标准的比较方法来作比较。否则,如果要比较的元素类型不一致,就像我们前面提到过的那样,如果比较的对象不一致,那么要得到一个准确的或者说绝对的比较结果就有些冒险。

当我们比较list1和list2时,listl和list2进行逐项比较。第一个比较操作发生在两个列表的第一个元素之间,比如说,123跟456比较,因为123<456,所以list1被认为小于list2。

如果比较的值相等,那么两个序列的下一个值继续比较,直到不相等的情况出现,或者到达较短的一个序列的末尾。在这种情况下,长的序列被认为是“较大”的。这就是为什么上面的list2<list3的原因。元组类型比较也是用这种算法。最后我们以这种算法的关键点作为本节的结束。

1.对两个列表的元素进行比较。

2.如果比较的元素是同类型的,则比较其值,返回结果。

3.如果两个元素不是同一种类型,则检查它们是否是数字。

a.如果是数字,执行必要的数字强制类型转换,然后比较。

b.如果有一方的元素是数字,则另一方的元素“大”(数字是“最小的”)。

c.否则,通过类型名字的字母顺序进行比较。

4.如果有一个列表首先到达末尾,则另一个长一点的列表“大”。

5.如果我们用尽了两个列表的元素而且所有元素都是相等的,那么结果就是个平局,就是说返回一个0。

6.13.2 序列类型函数

1. len()

对字符串来说len()返回字符串的长度,就是字符串包含的字符个数。对列表或者元组来说,它会像你想像的那样返回列表或者元组的元素个数,容器里面的每个对象被作为一个项来处理。我们下面的例子用了上面已经定义的列表。

6.13 内建函数 - 图2

2. max()和min()

max()和min()函数在字符串操作里面用处不大,因为它们能对字符串做的只能是找出字符串中“最大”和“最小”的字符(按词典序),而对列表和元组来说,它们被定义了更多的用处。比如对只包含数字和字符串对象的列表,max()和min()函数就非常有用,重申一遍,混合对象的结构越复杂返回的结构准确性就越差。然而,在有些情况下(虽然很少),这样的操作可以返回你需要的结果。我们展示了一些使用上面定义好的列表的例子。

6.13 内建函数 - 图3

3. sorted()和reversed()

6.13 内建函数 - 图4

初学者使用字符串,应该注意如何把单引号和双引号的使用矛盾和谐掉,同时还要注意字符串排序使用的是字典序,而不是字母序(字母‘Τ’的ASCII码值要比字母‘a’的还要靠前)

4. enumerate()和 zip()

6.13 内建函数 - 图5

5. sum()

6.13 内建函数 - 图6

6.13 内建函数 - 图7

6. list()和tuple()

list()函数和tuple()函数接受可迭代对象(比如另一个序列)作为参数,并通过浅拷贝数据来创建一个新的列表或者元组。虽然字符串也是序列类型的,但是它们并不是经常用于list()和tuple()。更多的情况下,它们用于在两种类型之间进行转换,比如你需要把一个已有的元组转换成列表类型的(然后你就可以修改它的元素了),或者相反。

6.13 内建函数 - 图8

正如我们在本章的开头所讨论的,无论list()还是tuple()都不可能做完全的转换(见6.1.2节)。也就是说,你传给tuple()的一个列表对象不可能变成一个元组,而你传给list()的对象也不可能真正的变成一个列表。虽然前后两个对象(原来的和新的对象)有着相同的数据集合(所以相等==),但是变量指向的却不是同一个对象了(所以执行is操作会返回false)。还要注意,即使它们的所有的值都相同,一个列表也不可能“等于”一个元组。

6.13.3 列表类型内建函数

如果你不考虑range()函数的话,Python中没有特定用于列表的内建函数。range()函数接受一个数值作为输入,输出一个符合标准的列表。第8章里面详细讨论了range()函数。列表类型对象可以使用大多数的对象和序列的内建函数,并且,列表对象有属于它们自己的方法。