2.6 Python 之禅
编程语言Perl曾在互联网领域长期占据着统治地位,早期的大多数交互式网站使用的都是 Perl脚本。彼时,“解决问题的办法有多个”被Perl社区奉为座右铭。这种理念一度深受大家的喜 爱,因为这种语言固有的灵活性使得大多数问题都有很多不同的解决之道。在开发项目期间,这 种灵活性是可以接受的,但大家最终认识到,过于强调灵活性会导致大型项目难以维护:要通过 研究代码搞清楚当时解决复杂问题的人是怎么想的,既困难又麻烦,还会耗费大量的时间。
经验丰富的程序员倡导尽可能避繁就简。Python社区的理念都包含在Tim Peters撰写的 “Python之禅”中。要获悉这些有关编写优秀Python代码的指导原则,只需在解释器中执行命令 import this。这里不打算赘述整个“Python之禅”,而只与大家分享其中的几条原则,让你明白 为何它们对Python新手来说至关重要。
代码语言:javascript复制>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Python程序员笃信代码可以编写得漂亮而优雅。编程是要解决问题的,设计良好、高效而漂 亮的解决方案都会让程序员心生敬意。随着你对Python的认识越来越深入,并使用它来编写越来 越多的代码,有一天也许会有人站在你后面惊呼:“哇,代码编写得真是漂亮!”
代码语言:javascript复制Simple is better than complex.
如果有两个解决方案,一个简单,一个复杂,但都行之有效,就选择简单的解决方案吧。这 样,你编写的代码将更容易维护,你或他人以后改进这些代码时也会更容易。
代码语言:javascript复制Complex is better than complicated.
现实是复杂的,有时候可能没有简单的解决方案。在这种情况下,就选择最简单可行的解决 方案吧。
代码语言:javascript复制Readability counts.
即便是复杂的代码,也要让它易于理解。开发的项目涉及复杂代码时,一定要为这些代码编 写有益的注释。
代码语言:javascript复制There should be one-- and preferably only one --obvious way to do it.
如果让两名Python程序员去解决同一个问题,他们提供的解决方案应大致相同。这并不是说 编程没有创意空间,而是恰恰相反!然而,大部分编程工作都是使用常见解决方案来解决简单的 小问题,但这些小问题都包含在更庞大、更有创意空间的项目中。在你的程序中,各种具体细节 对其他Python程序员来说都应易于理解。
代码语言:javascript复制Now is better than never
你可以将余生都用来学习Python和编程的纷繁难懂之处,但这样你什么项目都完不成。不要 企图编写完美无缺的代码;先编写行之有效的代码,再决定是对其做进一步改进,还是转而去编 写新代码。
2.7 小结
在本章中,你学习了:如何使用变量;如何创建描述性变量名以及如何消除名称错误和语法 错误;字符串是什么,以及如何使用小写、大写和首字母大写方式显示字符串;使用空白来显示 整洁的输出,以及如何剔除字符串中多余的空白;如何使用整数和浮点数;使用数值数据时需要 注意的意外行为。你还学习了如何编写说明性注释,让代码对你和其他人来说更容易理解。最后, 你了解了让代码尽可能简单的理念。 在第3章,你将学习如何在被称为列表的变量中存储信息集,以及如何通过遍历列表来操作 其中的信息。
3.1 列表是什么
列表由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或 所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。 鉴于列表通常包含多个元素,给列表指定一个表示复数的名称(如letters、digits或names)是 个不错的主意。
在Python中,用方括号([])来表示列表,并用逗号来分隔其中的元素。下面是一个简单的 列表示例,这个列表包含几种自行车
bicycles.py
代码语言:javascript复制bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)
如果你让Python将列表打印出来,Python将打印列表的内部表示,包括方括号:
代码语言:javascript复制['trek', 'cannondale', 'redline', 'specialized']
鉴于这不是你要让用户看到的输出,下面来学习如何访问列表元素。
3.1.1 访问列表元素
列表是有序集合,因此要访问列表的任何元素,只需将该元素的位置或索引告诉Python即可。 要访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括号内。 例如,下面的代码从列表bicycles中提取第一款自行车:
代码语言:javascript复制bicycles = ['trek', 'cannondale', 'redline', 'specialized']
1 print(bicycles[0])
1处演示了访问列表元素的语法。当你请求获取列表元素时,Python只返回该元素,而不包 括方括号和引号:
代码语言:javascript复制trek
这正是你要让用户看到的结果——整洁、干净的输出。 你还可以对任何列表元素调用第2章介绍的字符串方法。例如,可使用方法title()让元素 'trek'的格式更整洁:
代码语言:javascript复制bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0].title())
这个示例的输出与前一个示例相同,只是首字母T是大写的。
3.1.2 索引从 0 而不是 1 开始
在Python中,第一个列表元素的索引为0,而不是1。在大多数编程语言中都是如此,这与列 表操作的底层实现相关。如果结果出乎意料,请看看你是否犯了简单的差一错误。 第二个列表元素的索引为1。根据这种简单的计数方式,要访问列表的任何元素,都可将其 位置减1,并将结果作为索引。例如,要访问第四个列表元素,可使用索引3。 下面的代码访问索引1和3处的自行车:
代码语言:javascript复制bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[1])
print(bicycles[3])
这些代码返回列表中的第二个和第四个元素:
代码语言:javascript复制cannondale
specialized
Python为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1,可让Python返 回最后一个列表元素:
代码语言:javascript复制print(bicycles[-1])
这些代码返回'specialized'。这种语法很有用,因为你经常需要在不知道列表长度的情况 下访问最后的元素。这种约定也适用于其他负数索引,例如,索引-2返回倒数第二个列表元素, 索引-3返回倒数第三个列表元素,以此类推。
3.1.3 使用列表中的各个值
可像使用其他变量一样使用列表中的各个值。例如,你可以使用拼接根据列表中的值来创建 消息。
下面来尝试从列表中提取第一款自行车,并使用这个值来创建一条消息:
代码语言:javascript复制bicycles = ['trek', 'cannondale', 'redline', 'specialized']
1 message = "My first bicycle was a " bicycles[0].title() "."
print(message)
我们使用bicycles[0]的值生成了一个句子,并将其存储在变量message中(见)。输出是一 个简单的句子,其中包含列表中的第一款自行车:
代码语言:javascript复制My first bicycle was a Trek.
3.2 修改、添加和删除元素
你创建的大多数列表都将是动态的,这意味着列表创建后,将随着程序的运行增删元素。例如,你创建一个游戏,要求玩家射杀从天而降的外星人;为此,可在开始时将一些外星人存储在 列表中,然后每当有外星人被射杀时,都将其从列表中删除,而每次有新的外星人出现在屏幕上 时,都将其添加到列表中。在整个游戏运行期间,外星人列表的长度将不断变化。
3.2.1 修改列表元素
修改列表元素的语法与访问列表元素的语法类似。要修改列表元素,可指定列表名和要修改 的元素的索引,再指定该元素的新值。 例如,
假设有一个摩托车列表,其中的第一个元素为'honda',如何修改它的值呢?
motorcycles.py
代码语言:javascript复制1 motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
2 motorcycles[0] = 'ducati'
print(motorcycles)
我们首先定义一个摩托车列表,其中的第一个元素为'honda'(见)。接下来,我们将第一 个元素的值改为'ducati'(见)。输出表明,第一个元素的值确实变了,但其他列表元素的值 没变:
代码语言:javascript复制['honda', 'yamaha', 'suzuki']
['ducati', 'yamaha', 'suzuki']
你可以修改任何列表元素的值,而不仅仅是第一个元素的值。
3.2.2 在列表中添加元素
你可能出于众多原因要在列表中添加新元素,例如,你可能希望游戏中出现新的外星人、添 加可视化数据或给网站添加新注册的用户。Python提供了多种在既有列表中添加新数据的方式。
1. 在列表末尾添加元素 在列表中添加新元素时,最简单的方式是将元素附加到列表末尾。给列表附加元素时,它将 添加到列表末尾。继续使用前一个示例中的列表,在其末尾添加新元素'ducati':
代码语言:javascript复制motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
1 motorcycles.append('ducati')
print(motorcycles)
方法append()将元素'ducati'添加到了列表末尾(见1),而不影响列表中的其他所有元素:
代码语言:javascript复制['honda', 'yamaha', 'suzuki']
['honda', 'yamaha', 'suzuki', 'ducati']
方法append()让动态地创建列表易如反掌,例如,你可以先创建一个空列表,再使用一系列的 append()语句添加元素。下面来创建一个空列表,再在其中添加元素'honda'、'yamaha'和'suzuki':
代码语言:javascript复制motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
print(motorcycles)
最终的列表与前述示例中的列表完全相同
代码语言:javascript复制['honda', 'yamaha', 'suzuki']
这种创建列表的方式极其常见,因为经常要等程序运行后,你才知道用户要在程序中存储哪 些数据。为控制用户,可首先创建一个空列表,用于存储用户将要输入的值,然后将用户提供的 每个新值附加到列表中。
2. 在列表中插入元素
使用方法insert()可在列表的任何位置添加新元素。为此,你需要指定新元素的索引和值。
代码语言:javascript复制motorcycles = ['honda', 'yamaha', 'suzuki']
1 motorcycles.insert(0, 'ducati')
print(motorcycles)
在这个示例中,值'ducati'被插入到了列表开头(见1);方法insert()在索引0处添加空间, 并将值'ducati'存储到这个地方。这种操作将列表中既有的每个元素都右移一个位置:
1. 使用del语句删除元素
如果知道要删除的元素在列表中的位置,可使用del语句。
代码语言:javascript复制motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
1 del motorcycles[0]
print(motorcycles)
1 处的代码使用del删除了列表motorcycles中的第一个元素——'honda':
代码语言:javascript复制['honda', 'yamaha', 'suzuki']
['yamaha', 'suzuki']
使用del可删除任何位置处的列表元素,条件是知道其索引。下例演示了如何删除前述列表 中的第二个元素——'yamaha':
代码语言:javascript复制motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[1]
print(motorcycles)
下面的输出表明,已经将第二款摩托车从列表中删除了:
代码语言:javascript复制['honda', 'yamaha', 'suzuki']
['honda', 'suzuki']
在这两个示例中,使用del语句将值从列表中删除后,你就无法再访问它了。