- 编程风格:程序设计与系统构建的艺术(原书第2版)
- (美)克里斯蒂娜·维代拉·洛佩斯
- 1448字
- 2025-04-15 17:59:02
Python主义
本书中使用的示例代码都是用Python编写的,但是理解这些风格并不需要Python专业知识。事实上,每章都有一个用其他语言编写示例程序的练习。因此,读者只需要能够阅读Python而无须使用Python编写程序。
Python相对容易阅读。然而,该编程语言的一些功能可能会使习惯其他编程语言的读者感到困惑。这里将解释其中的一些:
❑列表(List)。在Python中,列表是一种由专用语法支持的原始数据类型,该语法通常与类C语言中的数组相关联,例如mylist=[0,1,2,3,4,5]。Python没有将数组作为原始数据类型[3],并且在大多数情况下,若在类C语言中使用数组,那么在Python中将使用列表。
❑元组(Tuple)。元组是一个不可变的列表。元组也是由专用语法支持的原始数据类型,通常与类LISP语言中的列表相关联,例如mytuple=(0,1,2,3,4)。元组和列表的处理方式相似,只是元组是不可变的,因此更改列表的操作不适用于元组。
❑列表索引(List indexing)。列表和元组的元素通过索引的方式来访问,例如mylist[某个索引值]。列表的索引下界是0,和类C语言一样,列表的长度是len(mylist)。通过索引访问列表的表现力远比这个简单示例所呈现的更强。以下是更多示例:
●mylist[0],列表的第一个元素;
●mylist[-1],列表的最后一个元素;
●mylist[-2],列表的倒数第二个元素;
●mylist[1:],列表mylist中,索引1到列表结束对应的全部元素;
●mylist[1:3],列表mylist中,索引1到索引3对应的全部元素;
●mylist[::2],列表mylist中,从第一个元素开始,每隔一个元素获取一个元素,直到列表结束;
●mylist[start:stop:step],列表mylist中,从索引start开始到索引stop结束每隔step个元素获取一个元素。
❑边界(Bound)。对超出列表长度的元素进行索引将产生IndexError。例如,如预期的一样,尝试访问包含3个元素的列表的第4个元素(例如[10,20,30][3])会导致IndexError。然而,Python中许多针对列表(以及通用集合)的操作,在索引方面都是建构主义风格。例如,在只有3个元素的列表中获取索引3到100的元素组成的列表(例如[10,20,30][3:100]),会生成空列表([])而不是导致IndexError。类似地,任何列表访问索引只要部分覆盖列表都会得到覆盖列表的部分的结果,不会导致IndexError(例如[10,20,30][2:10]的结果为[30])。对于习惯了严格语言的人来说,这种建构主义风格起初可能令人费解。
❑字典(Dictionary)。在Python中,字典或映射也是由专用语法支持的原始数据类型,例如mydict={‘a’:1,‘b’:2}。这个特定的字典将两个字符串键映射到两个整数值。通常,键和值可以是任何类型的。在Java中,这些类型的字典对应HashMap类等形式,而在C++中,它们对应类模板map等形式。
❑self。在大多数面向对象的语言中,对象对自身的引用是通过特殊语法隐式实现的,例如Java和C++中的this、PHP中的$this或Ruby中的@。与这些语言不同,Python在这方面没有专门的语法。此外,实例方法只是将对象作为第一个参数的类方法。此时,第一个参数按照惯例称为self,但不是语言的特殊要求。以下是一个类定义的示例,其中包含2个实例方法:

这两个方法都有一个名为self且在第一个位置的参数,在它们的函数体中都会访问这个参数(self)。self这个词没有什么特别之处,方法可以使用任何其他名称,例如me或my甚至this,但是除self之外的任何词都不会被Python程序员接受。然而,在调用实例方法时,可能会很令人惊讶,因为省略了第一个参数(self):

这种参数数量上的不匹配是由Python中的点符号(.)导致的,它只是另一种更原始的方法调用的语法糖:

❑构造函数。在Python中,构造函数是名为__init__的常规方法。具有这个名称的方法会在对象创建后立即被Python运行时自动调用。下面是一个带有构造函数的类及其用法的示例:

[1]一个免费的电子书网站。——译者注
[2]本书示例中使用的是《傲慢与偏见》英文版内容。——译者注
[3]Python中有一个数组数据对象,但它不是该语言的原始类型,也没有任何特殊的语法。它不像列表那样被广泛使用。