1、_Python 3.5.1 入门指南2016/2/271. 开胃菜12. 使用 Python 解释器32.1. 调用 Python 解释器32.1.1. 参数传递42.1.2. 交互模式42.2. 解释器及其环境42.2.1. 源程序编码43. Python 简介63.1. 将 Python 当做计算器63.1.1. 数字63.1.2. 字符串83.1.3. 列表123.2. 编程的第一步144. 深入 Python 流程控制164.1. if 语句164.2. for 语句164.3. range() 函数174.4. break 和 continue 语句, 以及循环中的 else 子句1
2、84.5. pass 语句194.6. 定义函数194.7. 深入 Python 函数定义214.7.1. 默认参数值214.7.2. 关键字参数234.7.3. 可变参数列表254.7.4. 参数列表的分拆254.7.5. Lambda 形式264.7.6. 文档字符串264.7.7. 函数注解274.8. 插曲:编码风格275. 数据结构295.1. 关于列表更多的内容295.1.1. 把链表当作堆栈使用305.1.2. 把链表当作队列使用315.1.3. 列表推导式315.1.4. 嵌套的列表推导式335.2. del 语句345.3. 元组和序列355.4. 集合365.5. 字典37
3、5.6. 循环技巧385.7. 深入条件控制395.8. 比较序列和其它类型406. 模块416.1. 深入模块426.1.1. 作为脚本来执行模块436.1.2. 模块的搜索路径436.1.3. “编译的” Python 文件446.2. 标准模块446.3. dir() 函数456.4. 包466.4.1. 从 * 导入包486.4.2. 包内引用496.4.3. 多重目录中的包497. 输入和输出507.1. 格式化输出507.1.1. 旧式的字符串格式化537.2. 文件读写537.2.1. 文件对象方法547.2.2. 使用 json 存储结构化数据568. 错误和异常588.1.
4、语法错误588.2. 异常588.3. 异常处理598.4. 抛出异常618.5. 用户自定义异常628.6. 定义清理行为638.7. 预定义清理行为649. 类659.1. 术语相关659.2. Python 作用域和命名空间659.2.1. 作用域和命名空间示例679.3. 初识类689.3.1. 类定义语法689.3.2. 类对象689.3.3. 实例对象699.3.4. 方法对象709.3.5. 类和实例变量709.4. 一些说明729.5. 继承739.5.1. 多继承749.6. 私有变量759.7. 补充759.8. 异常也是类769.9. 迭代器779.10. 生成器789.
5、11. 生成器表达式7910. Python 标准库概览8010.1. 操作系统接口8010.2. 文件通配符8010.3. 命令行参数8110.4. 错误输出重定向和程序终止8110.5. 字符串正则匹配8110.6. 数学8110.7. 互联网访问8210.8. 日期和时间8310.9. 数据压缩8310.10. 性能度量8310.11. 质量控制8410.12. “瑞士军刀”8511. 标准库浏览 Part II8611.1. 输出格式8611.2. 模板8711.3. 使用二进制数据记录布局8811.4. 多线程8811.5. 日志8911.6. 弱引用9011.7. 列表工具9011
6、.8. 十进制浮点数算法9212. 虚拟环境和包9312.1. 简介9312.2. 创建虚拟环境9312.3. 使用 pip 管理包94精品资料1. 开胃菜如果你要用计算机做很多工作,最后你会发现有一些任务你更希望用自动化的方式进行处理。比如,你想要在大量的文本文件中执行查找/替换,或者以复杂 的方式对大量的图片进行重命名和整理。也许你想要编写一个小型的自定义数据库、一个特殊的 GUI 应用程序或一个简单的小游戏。如果你是一名专业的软件开发者,可能你必须使用几种 C/C+/JAVA 类库,并且发现通常编写/编译/测试/重新编译的周期是如此漫长。也许你正在为这些类库编写测试用例,但是发现这是一个
7、让人烦躁的工作。又或者你已经完成 了一个可以使用扩展语言的程序,但你并不想为此重新设计并实现一套全新的语言。那么 Python 正是你所需要的语言。虽然你能够通过编写 Unix shell 脚本或 Windows 批处理文件来处理其中的某些任务,但 Shell 脚本更适合移动文件或修改文本数据,并不适合编写 GUI 应用程序或游戏;虽然你能够使用 C/C+/JAVA 编写程序,但即使编写一个简单的 first-draft 程序也有可能耗费大量的开发时间。相比之下,Python 更易于使用,无论在 Windows、Mac OS X 或 Unix 操作系统上它都会帮助你更快地完成任务。虽然 Pyt
8、hon 易于使用,但它却是一门完整的编程语言;与 Shell 脚本或批处理文件相比,它为编写大型程序提供了更多的结构和支持。另一方面,Python 提供了比 C 更多的错误检查,并且作为一门 高级语言,它内置支持高级的数据结构类型,例如:灵活的数组和字典。因其更多的通用数据类型,Python 比 Awk 甚至 Perl 都适用于更多问题领域,至少大多数事情在 Python 中与其他语言同样简单。Python 允许你将程序分割为不同的模块,以便在其他的 Python 程序中重用。Python 内置提供了大量的标准模块,你可以将其用作程序的基础,或者作为学习 Python 编程的示例。这些模块提供
9、了诸如文件 I/O、系统调用、Socket 支持,甚至类似 Tk 的用户图形界面(GUI)工具包接口。Python 是一门解释型语言,因为无需编译和链接,你可以在程序开发中节省宝贵的时间。Python 解释器可以交互的使用,这使得试验语言的特性、编写临时程序或在自底向上的程序开发中测试方法非常容易。你甚至还可以把它当做一个桌面计算器。Python 让程序编写的紧凑和可读。用 Python 编写的程序通常比同样的 C、C+ 或 Java 程序更短小,这是因为以下几个原因:* 高级数据结构使你可以在一条语句中表达复杂的操作;* 语句组使用缩进代替开始和结束大括号来组织;* 变量或参数无需声明。Py
10、thon 是 可扩展 的:如果你会 C 语言编程便可以轻易地为解释器添加内置函数或模块,或者为了对性能瓶颈作优化,或者将 Python 程序与只有二进制形式的库(比如某个专业的商业图形库)连接起来。一旦你真正掌握了它,你可以将 Python 解释器集成进某个 C 应用程序,并把它当作那个程序的扩展或命令行语言。顺便说一句,这个语言的名字来自于 BBC 的 “Monty Pythons Flying Cirecus” 节目,和爬行类动物没有任何关系。在文档中引用 Monty Python 的典故不仅可行,而且值得鼓励!现在你已经为 Python 兴奋不已了吧,大概想要领略一些更多的细节!学习一门
11、语言最好的方法就是使用它,本指南推荐你边读边使用 Python 解释器练习。下一节中,我们将解释 Python 解释器的用法。这是很简单的一件事情,但它有助于试验后面的例子。本手册剩下的部分将通过示例介绍 Python 语言及系统的诸多特性,开始是简单的语法、数据类型和表达式,接着介绍函数与模块,最后涉及异常和自定义类这样的高级内容。2. 使用 Python 解释器2.1. 调用 Python 解释器Python 解释器通常被安装在目标机器的 /usr/local/bin/python3.5 目录下。将 /usr/local/bin 目录包含进 Unix shell 的搜索路径里,以确保可以通
12、过输入:python3.5命令来启动他。1 由于 Python 解释器的安装路径是可选的,这也可能是其它路径,你可以联系安装 Python 的用户或系统管理员确认(例如,/usr/local/python 就是一个常见的选择)。在 Windows 机器上,Python 通常安装在 C:Python35 位置,当然你可以在运行安装向导时修改此值。要想把此目录添加到你的 PATH 环境变量中,你可以在 DOS 窗口中输入以下命令:set path=%path%;C:python35通常你可以在主窗口输入一个文件结束符(Unix 系统是 Control-D,Windows 系统是 Control-Z
13、)让解释器以 0 状态码退出。如果那没有作用,你可以通过输入 quit() 命令退出解释器。Python 解释器具有简单的行编辑功能。在 Unix 系统上,任何 Python 解释器都可能已经添加了 GNU readline 库支持,这样就具备了精巧的交互编辑和历史记录等功能。在 Python 主窗口中输入 Control-P 可能是检查是否支持命令行编辑的最简单的方法。如果发出嘟嘟声(计算机扬声器),则说明你可以使用命令行编辑功能;更多快捷键的介绍请参考 交互式输入行编辑历史回溯。如果没有任何声音,或者显示 P 字符,则说明命令行编辑功能不可用;你只能通过退格键从当前行删除已键入的字符并重新
14、输入。Python 解释器有些操作类似 Unix shell:当使用终端设备(tty)作为标准输入调用时,它交互的解释并执行命令;当使用文件名参数或以文件作为标准输入调用时,它读取文件并将文件作为 脚本 执行。第二种启动 Python 解释器的方法是 python -c command arg .,这种方法可以在 命令行 执行 Python 语句,类似于 shell 中的 -c 选项。由于 Python 语句通常会包含空格或其他特殊 shell 字符,一般建议将 命令 用单引号包裹起来。有一些 Python 模块也可以当作脚本使用。你可以使用 python -m module arg . 命令
15、调用它们,这类似在命令行中键入完整的路径名执行 模块 源文件一样。使用脚本文件时,经常会运行脚本然后进入交互模式。这也可以通过在脚本之前加上 -i 参数来实现。2.1.1. 参数传递调用解释器时,脚本名和附加参数传入一个名为 sys.argv 的字符串列表。你能够获取这个列表通过执行 import sys,列表的长度大于等于1;没有给定脚本和参数时,它至少也有一个元素:sys.argv0 此时为空字符串。脚本名指定为 - (表示标准输入)时, sys.argv0 被设定为 -,使用 -c 指令 时,sys.argv0 被设定为 -c。使用 -m 模块 参数时,sys.argv0 被设定为指定模
16、块的全名。-c 指令 或者 -m 模块 之后的参数不会被 Python 解释器的选项处理机制所截获,而是留在 sys.argv 中,供脚本命令操作。2.1.2. 交互模式从 tty 读取命令时,我们称解释器工作于 交互模式。这种模式下它根据主提示符来执行,主提示符通常标识为三个大于号();继续的部分被称为 从属提示符,由三个点标识(.)。在第一行之前,解释器打印欢迎信息、版本号和授权提示:$ python3.5Python 3.5 (default, Mar 16 2014, 09:25:04)GCC 4.8.2 on linuxType help, copyright, credits or
17、 license for more information.输入多行结构时需要从属提示符了,例如,下面这个 if 语句: the_world_is_flat = 1 if the_world_is_flat:. print(Be careful not to fall off!).Be careful not to fall off!关于交互模式更多的内容,请参见 交互模式。2.2. 解释器及其环境2.2.1. 源程序编码默认情况下,Python 源文件是 UTF-8 编码。在此编码下,全世界大多数语言的字符可以同时用在字符串、标识符和注释中 尽管 Python 标准库仅使用 ASCII 字符
18、做为标识符,这只是任何可移植代码应该遵守的约定。如果要正确的显示所有的字符,你的编辑器必须能识别出文件是 UTF-8 编码,并且它使用的字体能支持文件中所有的字符。你也可以为源文件指定不同的字符编码。为此,在 #! 行(首行)后插入至少一行特殊的注释行来定义源文件的编码:# -*- coding: encoding -*-通过此声明,源文件中所有的东西都会被当做用 encoding 指代的 UTF-8 编码对待。在 Python 库参考手册 codecs 一节中你可以找到一张可用的编码列表。例如,如果你的编辑器不支持 UTF-8 编码的文件,但支持像 Windows-1252 的其他一些编码,
19、你可以定义:# -*- coding: cp-1252 -*-这样就可以在源文件中使用 Windows-1252 字符集中的所有字符了。这个特殊的编码注释必须在文件中的 第一或第二 行定义。Footnotes1在 Unix 系统上,Python 3.X 解释器默认未被安装成名为 python 的命令,所以它不会与同时安装在系统中的 Python 2.x 命令冲突。3. Python 简介下面的例子中,输入和输出分别由大于号和句号提示符( 和 . )标注:如果想重现这些例子,就要在解释器的提示符后,输入(提示符后面的)那些不包含提示符的代码行。需要注意的是在练习中遇到的从属提示符表示你需要在最后
20、多输入一个空行,解释器才能知道这是一个多行命令的结束。本手册中的很多示例包括那些带有交互提示符的都含有注释。Python 中的注释以 # 字符起始,直至实际的行尾(译注这里原作者用了 physical line 以表示实际的换行而非编辑器的自动换行)。注释可以从行首开始,也可以在空白或代码之后,但是不出现在字符串中。文本字符串中的 # 字符仅仅表示 # 。代码中的注释不会被 Python 解释,录入示例的时候可以忽略它们。如下示例:# this is the first commentspam = 1 # and this is the second comment # . and now a
21、 third!text = # This is not a comment because its inside quotes.3.1. 将 Python 当做计算器我们来尝试一些简单的 Python 命令。启动解释器然后等待主提示符 出现(不需要很久)。3.1.1. 数字解释器表现得就像一个简单的计算器:可以向其录入一些表达式,它会给出返回值。表达式语法很直白:运算符 +,-,* 和 / 与其它语言一样(例如:Pascal 或 C);括号 () 用于分组。例如: 2 + 24 50 - 5*620 (50 - 5*6) / 45.0 8 / 5 # division always retur
22、ns a floating point number1.6整数(例如,2, 4, 20 )的类型是 int,带有小数部分的数字(例如,5.0, 1.6)的类型是 float。在本教程的后面我们会看到更多关于数字类型的内容。除法(/)永远返回一个浮点数。如要使用 floor 除法 并且得到整数结果(丢掉任何小数部分),你可以使用 / 运算符;要计算余数你可以使用 % 17 / 3 # classic division returns a float5.666666666666667 17 / 3 # floor division discards the fractional part5 17
23、% 3 # the % operator returns the remainder of the division2 5 * 3 + 2 # result * divisor + remainder17通过 Python,还可以使用 * 运算符计算幂乘方 1: 5 * 2 # 5 squared25 2 * 7 # 2 to the power of 7128等号( = )用于给变量赋值。赋值之后,在下一个提示符之前不会有任何结果显示: width = 20 height = 5*9 width * height900变量在使用前必须 “定义”(赋值),否则会出错: # try to acc
24、ess an undefined variable. nTraceback (most recent call last): File , line 1, in NameError: name n is not defined浮点数有完整的支持;整数和浮点数的混合计算中,整数会被转换为浮点数: 3 * 3.75 / 1.57.5 7.0 / 23.5交互模式中,最近一个表达式的值赋给变量 _。这样我们就可以把它当作一个桌面计算器,很方便的用于连续计算,例如: tax = 12.5 / 100 price = 100.50 price * tax12.5625 price + _113.0625
25、 round(_, 2)113.06此变量对于用户是只读的。不要尝试给它赋值 你只会创建一个独立的同名局部变量,它屏蔽了系统内置变量的魔术效果。除了 int 和 float,Python 还支持其它数字类型,例如 Decimal 和 Fraction。Python 还内建支持 复数 ,使用后缀 j 或 J 表示虚数部分(例如,3+5j)。3.1.2. 字符串相比数值,Python 也提供了可以通过几种不同方式表示的字符串。它们可以用单引号 (.) 或双引号 (.) 标识 2。 可以用来转义引号: spam eggs # single quotesspam eggs doesnt # use t
26、o escape the single quote.doesnt doesnt # .or use double quotes insteaddoesnt Yes, he said.Yes, he said. Yes, he said.Yes, he said. Isnt, she said.Isnt, she said.在交互式解释器中,输出的字符串会用引号引起来,特殊字符会用反斜杠转义。虽然可能和输入看上去不太一样,但是两个字符串是相等的。如果字符串中只有单引号而没有双引号,就用双引号引用,否则用单引号引用。print() 函数生成可读性更好的输出, 它会省去引号并且打印出转义后的特殊字符
27、: Isnt, she said.Isnt, she said. print(Isnt, she said.)Isnt, she said. s = First line.nSecond line. # n means newline s # without print(), n is included in the outputFirst line.nSecond line. print(s) # with print(), n produces a new lineFirst line.Second line.如果你前面带有 的字符被当作特殊字符,你可以使用 原始字符串,方法是在第一个引号
28、前面加上一个 r: print(C:somename) # here n means newline!C:someame print(rC:somename) # note the r before the quoteC:somename字符串文本能够分成多行。一种方法是使用三引号:. 或者 .。行尾换行符会被自动包含到字符串中,但是可以在行尾加上 来避免这个行为。下面的示例: 可以使用反斜杠为行结尾的连续字符串,它表示下一行在逻辑上是本行的后续内容:print(Usage: thingy OPTIONS -h Display this usage message -H hostname Ho
29、stname to connect to)将生成以下输出(注意,没有开始的第一行):Usage: thingy OPTIONS -h Display this usage message -H hostname Hostname to connect to字符串可以由 + 操作符连接(粘到一起),可以由 * 表示重复: # 3 times un, followed by ium 3 * un + iumunununium相邻的两个字符串文本自动连接在一起。: Py thonPython它只用于两个字符串文本,不能用于字符串表达式: prefix = Py prefix thon # cant
30、concatenate a variable and a string literal .SyntaxError: invalid syntax (un * 3) ium .SyntaxError: invalid syntax如果你想连接多个变量或者连接一个变量和一个字符串文本,使用 +: prefix + thonPython这个功能在你想切分很长的字符串的时候特别有用: text = (Put several strings within parentheses to have them joined together.) textPut several strings within p
31、arentheses to have them joined together.字符串也可以被截取(检索)。类似于 C ,字符串的第一个字符索引为 0 。Python没有单独的字符类型;一个字符就是一个简单的长度为1的字符串。: word = Python word0 # character in position 0P word5 # character in position 5n索引也可以是负数,这将导致从右边开始计算。例如: word-1 # last charactern word-2 # second-last charactero word-6P请注意 -0 实际上就是 0,所以
32、它不会导致从右边开始计算。除了索引,还支持 切片。索引用于获得单个字符,切片 让你获得一个子字符串: word0:2 # characters from position 0 (included) to 2 (excluded)Py word2:5 # characters from position 2 (included) to 5 (excluded)tho注意,包含起始的字符,不包含末尾的字符。这使得 s:i + si: 永远等于 s: word:2 + word2:Python word:4 + word4:Python切片的索引有非常有用的默认值;省略的第一个索引默认为零,省略的第
33、二个索引默认为切片的字符串的大小。: word:2 # character from the beginning to position 2 (excluded)Py word4: # characters from position 4 (included) to the endon word-2: # characters from the second-last (included) to the endon有个办法可以很容易地记住切片的工作方式:切片时的索引是在两个字符 之间 。左边第一个字符的索引为 0,而长度为 n 的字符串其最后一个字符的右界索引为 n。例如: +-+-+-+-+
34、-+-+ | P | y | t | h | o | n | +-+-+-+-+-+-+ 0 1 2 3 4 5 6-6 -5 -4 -3 -2 -1文本中的第一行数字给出字符串中的索引点 0.6。第二行给出相应的负索引。切片是从 i 到 j 两个数值标示的边界之间的所有字符。对于非负索引,如果上下都在边界内,切片长度就是两个索引之差。例如,word1:3 是 2 。试图使用太大的索引会导致错误: word42 # the word only has 6 charactersTraceback (most recent call last): File , line 1, in IndexEr
35、ror: string index out of rangePython 能够优雅地处理那些没有意义的切片索引:一个过大的索引值(即下标值大于字符串实际长度)将被字符串实际长度所代替,当上边界比下边界大时(即切片左值大于右值)就返回空字符串: word4:42on word42:Python字符串不可以被更改 它们是 不可变的 。因此,赋值给字符串索引的位置会导致错误: word0 = J .TypeError: str object does not support item assignment word2: = py .TypeError: str object does not sup
36、port item assignment如果你需要一个不同的字符串,你应该创建一个新的: J + word1:Jython word:2 + pyPypy内置函数 len() 返回字符串长度: s = supercalifragilisticexpialidocious len(s)343.1.3. 列表Python 有几个 复合 数据类型,用于表示其它的值。最通用的是 list (列表) ,它可以写作中括号之间的一列逗号分隔的值。列表的元素不必是同一类型: squares = 1, 4, 9, 16, 25 squares1, 4, 9, 16, 25就像字符串(以及其它所有内建的 序列 类
37、型)一样,列表可以被索引和切片: squares0 # indexing returns the item1 squares-125 squares-3: # slicing returns a new list9, 16, 25所有的切片操作都会返回一个包含请求的元素的新列表。这意味着下面的切片操作返回列表一个新的(浅)拷贝副本: squares:1, 4, 9, 16, 25列表也支持连接这样的操作: squares + 36, 49, 64, 81, 1001, 4, 9, 16, 25, 36, 49, 64, 81, 100不像 不可变的 字符串,列表是 可变的,它允许修改元素: c
38、ubes = 1, 8, 27, 65, 125 # somethings wrong here 4 * 3 # the cube of 4 is 64, not 65!64 cubes3 = 64 # replace the wrong value cubes1, 8, 27, 64, 125你还可以使用 append() 方法 (后面我们会看到更多关于列表的方法的内容)在列表的末尾添加新的元素: cubes.append(216) # add the cube of 6 cubes.append(7 * 3) # and the cube of 7 cubes1, 8, 27, 64, 1
39、25, 216, 343也可以对切片赋值,此操作可以改变列表的尺寸,或清空它: letters = a, b, c, d, e, f, g lettersa, b, c, d, e, f, g # replace some values letters2:5 = C, D, E lettersa, b, C, D, E, f, g # now remove them letters2:5 = lettersa, b, f, g # clear the list by replacing all the elements with an empty list letters: = letters
40、内置函数 len() 同样适用于列表: letters = a, b, c, d len(letters)4允许嵌套列表(创建一个包含其它列表的列表),例如: a = a, b, c n = 1, 2, 3 x = a, n xa, b, c, 1, 2, 3 x0a, b, c x01b3.2. 编程的第一步当然,我们可以使用 Python 完成比二加二更复杂的任务。例如,我们可以写一个生成 菲波那契 子序列的程序,如下所示: # Fibonacci series:. # the sum of two elements defines the next. a, b = 0, 1 while
41、b 10:. print(b). a, b = b, a+b.112358这个例子介绍了几个新功能。 第一行包括了一个 多重赋值:变量 a 和 b 同时获得了新的值 0 和 1 最后一行又使用了一次。在这个演示中,变量赋值前,右边首先完成计算。右边的表达式从左到右计算。 条件(这里是 b 10 )为 true 时, while 循环执行。在 Python 中,类似于 C,任何非零整数都是 true;0 是 false 条件也可以是字符串或列表,实际上可以是任何序列;所有长度不为零的是 true,空序列是 false。示例中的测试是一个简单的比较。标准比较操作符与 C 相同: , = , = 和
42、 !=。 循环 体 是 缩进 的:缩进是 Python 是 Python 组织語句的方法。Python (还)不提供集成的行编辑功能,所以你要为每一个缩进行输入 TAB 或空格。实践中建议你找个文本编辑来录入复杂的 Python 程序,大多数文本编辑器提供自动缩进。交互式录入复合语句时,必须在最后输入一个空行来标识结束(因为解释器没办法猜测你输入的哪一行是最后一行),需要 注意的是同一个语句块中的语句块必须缩进同样数量的空白。 关键字 print() 语句输出给定表达式的值。它控制多个表达式和字符串输出为你想要字符串(就像我们在前面计算器的例子中那样)。字符串打印时不用引号包围,每两个子项之间插入空间,所以你可以把格式弄得很漂亮,像这样: i = 256*256 print(The value of i is, i)The value of i is 65536用一个逗号结尾就可以禁止输出换行: a, b