本文参考《 Python 编程:从入门到实践》一书,作者: [ 美 ] Eric Matthes
第1章 起步
1.1 搭建python环境
在不同的操作系统中, Python 存在细微的差别。
1.1.1 Python 2和Python 3
在本书中,将指出 Python 2 和 Python 3 的重大差别。
1.1.2 运行Python代码片段
1.1.3 Hello World程序
长期以来,编程界都认为刚接触一门新语言时,如果首先使用它来编写一个在屏幕上显示消息“Hello World!”的程序,将给你带来好运。
只需一行代码:
print("Hello World!")
1.2 在不同操作系统中搭建 Python 编程环境
Python 是一种跨平台的编程语言,这意味着它能够运行在所有主要的操作系统中。在所有安装了 Python 的现代计算机上,都能够运行你编写的任何 Python 程序。然而,在不同的操作系统中,安装 Python 的方法存在细微的差别。
1.2.1 在 Linux 系统中搭建 Python 编程环境
1. 检查 Python 版本
2. 安装文本编辑器
Geany 是一款简单的文本编辑器:它易于安装;让你能够直接运行几乎所有的程序(而无需通过终端来运行);使用不同的颜色来显示代码,以突出代码语法;在终端窗口中运行代码,让你能够习惯使用终端。
3. 运行 Hello World 程序
4. 在终端会话中运行 Python 代码
1.2.2 在 OS X 系统中搭建 Python 编程环境
1. 检查是否安装了 Python
1.2.3 在 Windows 系统中搭建 Python 编程环境
Windows 系统并非都默认安装了 Python ,因此你可能需要下载并安装它,再下载并安装一个文本编辑器。
1. 安装 Python
2. 启动 Python 终端会话
3. 在终端会话中运行 Python
4. 安装文本编辑器
Geany 是一款简单的文本编辑器:它易于安装;让你能够直接运行几乎所有的程序(而无需通过终端);使用不同的颜色来显示代码,以突出代码语法;在终端窗口中运行代码,让你能够习惯使用终端。
5. 配置 Geany
6. 运行 Hello World 程序
1.3 解决安装问题
1.4 从终端运行 Python 程序
1.4.1 在 Linux 和 OS X 系统中从终端运行 Python 程序
1.4.2 在 Windows 系统中从终端运行 Python 程序
第 2 章 变量和简单数据类型
在本章中,你将学习可在 Python 程序中使用的各种数据,还将学习如何将数据存储到变量中,以及如何在程序中使用这些变量。
2.1 运行 hello_world.py 时发生的情况
运行 hello_world.py 时, Python 都做了些什么呢?下面来深入研究一下。实际上,即便是运行简单的程序, Python 所做的工作也相当多:
运行文件 hello_world.py 时,末尾的 .py 指出这是一个 Python 程序,因此编辑器将使用 Python 解释器 来运行它。 Python 解释器读取整个程序,确定其中每个单词的含义。例如,看到单词 print 时,解释器就会将括号中的内容打印到屏幕,而不会管括号中的内容是什么。
编写程序时,编辑器会以各种方式突出程序的不同部分。例如,它知道 print 是一个函数的名称,因此将其显示为蓝色;它知道 “Hello Python world!” 不是 Python 代码,因此将其显示为橙色。这种功能称为 语法突出 ,在你刚开始编写程序时很有帮助。
2.2 变量
2.2.1 变量的命名和使用
在 Python 中使用变量时,需要遵守一些规则和指南。违反这些规则将引发错误,而指南旨在让你编写的代码更容易阅读和理解。请务必牢记下述有关变量的规则。
变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为 message_1 ,但不能将其命名为 1_message 。
变量名不能包含空格,但可使用下划线来分隔其中的单词。例如,变量名 greeting_message 可行,但变量名 greeting message 会引发错误。
不要将 Python 关键字和函数名用作变量名,即不要使用 Python 保留用于特殊用途的单词,如 print (请参见附录 A.4 )。
变量名应既简短又具有描述性。例如, name 比 n 好, student_name 比 s_n 好, name_length 比 length_of_persons_name 好。
慎用小写字母 l 和大写字母 O ,因为它们可能被人错看成数字 1 和 0 。
要创建良好的变量名,需要经过一定的实践,在程序复杂而有趣时尤其如此。随着你编写的程序越来越多,并开始阅读别人编写的代码,将越来越善于创建有意义的变量名。
注意:就目前而言,应使用小写的 Python 变量名。在变量名中使用大写字母虽然不会导致错误,但避免使用大写字母是个不错的主意。
2.2.2 使用变量时避免命名错误
我们将有意地编写一些引发错误的代码。请输入下面的代码,包括其中拼写不正确的单词 mesage :
程序存在错误时, Python 解释器将竭尽所能地帮助你找出问题所在。程序无法成功地运行时,解释器会提供一个 traceback 。 traceback 是一条记录,指出了解释器尝试运行代码时,
在什么地方陷入了困境。下面是你不小心错误地拼写了变量名时, Python 解释器提供的 traceback :
解释器指出,文件 hello_world.py 的第 2 行存在错误(见❶);
它列出了这行代码,旨在帮助你快速找出错误(见❷);
它还指出了它发现的是什么样的错误(见❸)。在这里,解释器发现了一个名称错误,并指出打印的变量 mesage 未定义: Python 无法识别你提供的变量名。名称错误通常意味着两种情况:要么是使用变量前忘记了给它赋值,要么是输入变量名时拼写不正确。
Python 解释器不会对代码做拼写检查,但要求变量名的拼写一致。
很多编程错误都很简单,只是在程序的某一行输错了一个字符。为找出这种错误而花费很长时间的大有人在。很多程序员天资聪颖、经验丰富,却为找出这种细微的错误花费数小时。你可能觉得这很好笑,但别忘了,在你的编程生涯中,经常会有同样的遭遇。
注意:要理解新的编程概念,最佳的方式是尝试在程序中使用它们。如果你在做本书的练习时陷入了困境,请尝试做点其他的事情。如果这样做后依然无法摆脱困
境,请复习相关内容。如果这样做后情况依然如故,请参阅附录 C 的建议。
2.3 字符串
字符串虽然看似简单,但能够以很多不同的方式使用它们。
字符串 就是一系列字符。在 Python 中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号,如下所示:
这种灵活性让你能够在字符串中包含引号和撇号:
2.3.1 使用方法修改字符串的大小写
输出如下:
在这个示例中,小写的字符串 "ada lovelace" 存储到了变量 name 中。
在 print() 语句中,方法 title() 出现在这个变量的后面。
方法 是 Python 可对数据执行的操作。
每个方法后面都跟着一对括号,这是因为方法通常需要额外的信息来完成其工作。这种信息是在括号内提供的。
函数 title() 不需要额外的信息,因此它后面的括号是空的。
title() 以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写。这很有用!
还有其他几个很有用的大小写处理方法。例如,要将字符串改为全部大写或全部小写:
输出如下:
存储数据时,方法 lower() 很有用。很多时候,你无法依靠用户来提供正确的大小写,因此需要将字符串先转换为小写,再存储它们。以后需要显示这些信息时,再将其转换为最合适的大小写方式。
2.3.2 合并(拼接)字符串
Python 使用加号( + )来合并字符串。这种合并字符串的方法称为 拼接 。通过拼接,可使用存储在变量中的信息来创建完整的消息。
在这里,一个问候用户的句子中使用了全名(见❶),并使用了方法 title() 来将姓名设置为合适的格式。这些代码显示一条格式良好的简单问候语:
你可以使用拼接来创建消息,再把整条消息都存储在一个变量中:
这让最后的 print 语句简单得多(见❷)。
2.3.3 使用制表符或换行符来添加空白
在编程中, 空白 泛指任何非打印字符,如空格、制表符和换行符。你可使用空白来组织输出,以使其更易读。
要在字符串中添加制表符,可使用字符组合 \t
要在字符串中添加换行符,可使用字符组合 \n (这个就太熟悉了有木有^_^)
还可在同一个字符串中同时包含制表符和换行符。字符串 "\n\t" 让 Python 换到下一行,并在下一行开头添加一个制表符。
2.3.4 删除空白
在程序中,额外的空白可能令人迷惑。对程序员来说, 'python' 和 'python ' 看起来几乎没什么两样,但对程序来说,它们却是两个不同的字符串。 Python 能够发现 'python ' 中额外的空白,并认为它是有意义的 —— 除非你告诉它不是这样的。
空白很重要,因为你经常需要比较两个字符串是否相同。例如,一个重要的示例是,在用户登录网站时检查其用户名。但在一些简单得多的情形下,额外的空格也可能令人迷惑。所幸在 Python 中,删除用户输入的数据中的多余的空白易如反掌。
Python 能够找出字符串开头和末尾多余的空白。要确保字符串末尾没有空白,可使用方法 rstrip() 。
对变量 favorite_language 调用方法 rstrip() 后(见❸),这个多余的空格被删除了。然而,这种删除只是暂时的,接下来再次询问 favorite_language 的值时,你会发现这个字符串与输入时一样,依然包含多余的空白(见❹)。
要永久删除这个字符串中的空白,必须将删除操作的结果存回到变量中:
在编程中,经常需要修改变量的值,再将新值存回到原来的变量中。这就是变量的值可能随程序的运行或用户输入数据而发生变化的原因。
还可以剔除字符串开头的空白,或同时剔除字符串两端的空白。为此,可分别使用方法 lstrip() 和 rstrip() :
在实际程序中,这些剥除函数最常用于在存储用户输入前对其进行清理。
2.3.5 使用字符串时避免语法错误
注意:编写程序时,编辑器的语法突出功能可帮助你快速找出某些语法错误。看到 Python 代码以普通句子的颜色显示,或者普通句子以 Python 代码的颜色显示时,就可能意味着文件中存在引号不匹配的情况。
2.3.6 Python 2 中的 print 语句
在 Python 2 中,无需将要打印的内容放在括号内。从技术上说, Python 3 中的 print 是一个函数,因此括号必不可少。有些 Python 2 print 语句也包含括号,但其行为与 Python 3 中稍有不同。简单地说,在 Python 2 代码中,有些 print 语句包含括号,有些不包含。
2.4 数字
在编程中,经常使用数字来记录游戏得分、表示可视化数据、存储 Web 应用信息等。
2.4.1 整数
在 Python 中,可对整数执行加( + )减( - )乘( * )除( / )运算。
Python 使用两个乘号(**)表示乘方运算:
2.4.2 浮点数
浮点数 。大多数编程语言都使用了这个术语,它指出了这样一个事实:小数点可出现在数字的任何位置(浮点,即浮动的点)。
2.4.3 使用函数 str() 避免类型错误、
你可能认为,上述代码会打印一条简单的生日祝福语: Happy 23rd birthday! 。但如果你运行这些代码,将发现它们会引发错误:
这是一个 类型错误 ,意味着 Python 无法识别你使用的信息。在这个示例中, Python 发现你使用了一个值为整数( int )的变量,但它不知道该如何解读这个值(见❶)。 Python 知
道,这个变量表示的可能是数值 23 ,也可能是字符 2 和 3 。像上面这样在字符串中使用整数时,需要显式地指出你希望 Python 将这个整数用作字符串。为此,可调用函数 str() ,
它让 Python 将非字符串值表示为字符串:
这样, Python 就知道你要将数值 23 转换为字符串,进而在生日祝福消息中显示字符 2 和 3 。经过上述处理后,将显示你期望的消息,而不会引发错误。
大多数情况下,在 Python 中使用数字都非常简单。如果结果出乎意料,请检查 Python 是否按你期望的方式将数字解读为了数值或字符串。
2.4.4 Python 2 中的整数
在 Python 2 中,将两个整数相除得到的结果稍有不同:
Python 返回的结果为 1 ,而不是 1.5 。在 Python 2 中,整数除法的结果只包含整数部分,小数部分被删除。请注意,计算整数结果时,采取的方式不是四舍五入,而是将小数部分直接删除。
在 Python 2 中,若要避免这种情况,务必确保至少有一个操作数为浮点数,这样结果也将为浮点数:
从 Python 3 转而用 Python 2 或从 Python 2 转而用 Python 3 时,这种除法行为常常会令人迷惑。使用或编写同时使用浮点数和整数的代码时,一定要注意这种异常行为。
2.5 注释
在大多数编程语言中,注释都是一项很有用的功能。
2.5.1 如何编写注释
在 Python 中,注释用井号( # )标识。井号后面的内容都会被 Python 解释器忽略。
2.5.2 该编写什么样的注释
编写注释的主要目的是阐述代码要做什么,以及是如何做的。
在开发项目期间,你对各个部分如何协同工作了如指掌,但过段时间后,有些细节你可能不记得了。当然,你总是可以通过研究代码来确定各个部分的工作原理,但通过编写注释,以清晰的自然语言对解决方案进行概述,可节省很多时间。
要成为专业程序员或与其他程序员合作,就必须编写有意义的注释。
你最好从现在开始就在程序中添加描述性注释。作为新手,最值得养成的习惯之一是,在代码中编写清晰、简洁的注释。
如果不确定是否要编写注释,就问问自己,找到合理的解决方案前,是否考虑了多个解决方案。如果答案是肯定的,就编写注释对你的解决方案进行说明吧。相比回过头去再添加注释,删除多余的注释要容易得多。
2.6 Python 之禅
编程语言 Perl 曾在互联网领域长期占据着统治地位,早期的大多数交互式网站使用的都是 Perl 脚本。彼时, “ 解决问题的办法有多个 ” 被 Perl 社区奉为座右铭。这种理念一度深受大家的喜爱,因为这种语言固有的灵活性使得大多数问题都有很多不同的解决之道。在开发项目期间,这种灵活性是可以接受的,但大家最终认识到,过于强调灵活性会导致大型项目难以维护:要通过研究代码搞清楚当时解决复杂问题的人是怎么想的,既困难又麻烦,还会耗费大量的时间。
经验丰富的程序员倡导尽可能避繁就简。 Python 社区的理念都包含在 Tim Peters 撰写的 “Python 之禅 ” 中。要获悉这些有关编写优秀 Python 代码的指导原则,只需在解释器中执行命令 import this 。这里不打算赘述整个 “Python 之禅 ” ,而只与大家分享其中的几条原则,让你明白为何它们对 Python 新手来说至关重要。
Python 程序员笃信代码可以编写得漂亮而优雅。编程是要解决问题的,设计良好、高效而漂亮的解决方案都会让程序员心生敬意。随着你对 Python 的认识越来越深入,并使用它来编写越来越多的代码,有一天也许会有人站在你后面惊呼: “ 哇,代码编写得真是漂亮!"
即便是复杂的代码,也要让它易于理解。开发的项目涉及复杂代码时,一定要为这些代码编写有益的注释。
如果让两名 Python 程序员去解决同一个问题,他们提供的解决方案应大致相同。这并不是说编程没有创意空间,而是恰恰相反!然而,大部分编程工作都是使用常见解决方案来解
决简单的小问题,但这些小问题都包含在更庞大、更有创意空间的项目中。在你的程序中,各种具体细节对其他 Python 程序员来说都应易于理解。
你可以将余生都用来学习 Python 和编程的纷繁难懂之处,但这样你什么项目都完不成。不要企图编写完美无缺的代码;先编写行之有效的代码,再决定是对其做进一步改进,还是转而去编写新代码。
第 3 章 列表简介
列表让你能够在一个地方存储成组的信息,其中可以只包含几个元素,也可以包含数百万个元素。列表是新手可直接使用的最强大的 Python 功能之一,它融合了众多重要的编程概念。
3.1 列表是什么
列表 由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字 0~9 或所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。
在 Python 中,用方括号( [] )来表示列表,并用逗号来分隔其中的元素。
3.1.1 访问列表元素
列表是有序集合,因此要访问列表的任何元素,只需将该元素的位置或索引告诉 Python 即可。要访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括号内。
3.1.2 索引从 0 而不是 1 开始
根据这种简单的计数方式,要访问列表的任何元素,都可将其位置减 1 ,并将结果作为索引。
Python 为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为 -1 ,可让 Python 返回最后一个列表元素:
这种约定也适用于其他负数索引,例如,索引 -2 返回倒数第二个列表元素,索引 -3 返回倒数第三个列表元素,以此类推。
3.1.3 使用列表中的各个值
3.2 修改、添加和删除元素
你创建的大多数列表都将是动态的,这意味着列表创建后,将随着程序的运行增删元素。
3.2.1 修改列表元素
3.2.2 在列表中添加元素
1. 在列表末尾添加元素
使用方法 append() 将元素 添加到列表末尾。
方法 append() 让动态地创建列表易如反掌,例如,你可以先创建一个空列表,再使用一系列的 append() 语句添加元素。下面来创建一个空列表,再在其中添加元素 'honda' 、 'yamaha' 和 'suzuki' :
这种创建列表的方式极其常见,因为经常要等程序运行后,你才知道用户要在程序中存储哪些数据。为控制用户,可首先创建一个空列表,用于存储用户将要输入的值,然后将用户提供的每个新值附加到列表中。
2. 在列表中插入元素
使用方法 insert() 可在列表的任何位置添加新元素。为此,你需要指定新元素的索引和值。
这种操作将列表中既有的每个元素都右移一个位置:
3.2.3 从列表中删除元素
1. 使用 del 语句删除元素
如果知道要删除的元素在列表中的位置,可使用 del 语句。
看下结果:
使用 del 可删除任何位置处的列表元素,条件是知道其索引。
使用 del 语句将值从列表中删除后,你就无法再访问它了。
2. 使用方法 pop() 删除元素
有时候,你要将元素从列表中删除,并接着使用它的值。
方法 pop() 可删除列表末尾的元素,并让你能够接着使用它。术语 弹出 ( pop )源自这样的类比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。
我们首先定义并打印了列表 motorcycles (见❶)。接下来,我们从这个列表中弹出一个值,并将其存储到变量 popped_motorcycle 中(见❷)。然后我们打印这个列
表,以核实从其中删除了一个值(见❸)。最后,我们打印弹出的值,以证明我们依然能够访问被删除的值(见❹)。
输出表明,列表末尾的值 'suzuki' 已删除,它现在存储在变量 popped_motorcycle 中:
3. 弹出列表中任何位置处的元素
实际上,你可以使用 pop() 来删除列表中任何位置的元素,只需在括号中指定要删除的元素的索引即可。
别忘了,每当你使用 pop() 时,被弹出的元素就不再在列表中了。
如果你不确定该使用 del 语句还是 pop() 方法,下面是一个简单的判断标准:
如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用 del 语句;如果你要在删除元素后还能继续使用它,就使用方法 pop() 。
4. 根据值删除元素
有时候,你不知道要从列表中删除的值所处的位置。如果你只知道要删除的元素的值,可使用方法 remove() 。
使用 remove() 从列表中删除元素时,也可接着使用它的值。
注意 方法 remove() 只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。
3.3 组织列表
在你创建的列表中,元素的排列顺序常常是无法预测的,因为你并非总能控制用户提供数据的顺序。
3.3.1 使用方法 sort() 对列表进行永久性排序
方法 sort() (见❶)永久性地修改了列表元素的排列顺序。现在,汽车是按字母顺序排列的,再也无法恢复到原来的排列顺序:
你还可以按与字母顺序相反的顺序排列列表元素,为此,只需向 sort() 方法传递参数 reverse=True 。
3.3.2 使用函数 sorted() 对列表进行临时排序
要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数 sorted() 。函数 sorted() 让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。