Python学习手册(第4版)-第8部分&附录.pdf )

5星(超过95%的资源)
所需积分/C币:9 2011-12-08 00:07:36 3.45MB PDF
24
收藏 收藏
举报

Python学习手册 第4版第4部分: 第八部分 高级话题注 第36章 Unicode和字节字符串 Python 3.0中的字符串修改 字符串基础知识 字符编码方法 Python的字符串类型 文本和二进制文件 Python 3.0中的字符串应用 常量和基本属性 转换 编码Unicode字符串 编码ASCII文本 编码非ASCII文本 编码和解码非ASCII文本 其他Unicode编码技术 转换编码 在Python 2.6中编码Unicode字符串 源文件字符集编码声明 使用Python 3.0 Bytes对象 方法调用 序列操作 创建bytes对象的其他方式 混合字符串类型 使用Python 3.0(和Python 2.6)bytearray对象 使用文本文件和二进制文件 文本文件基础 Python 3.0中的文本和二进制模式 类型和内容错误匹配 使用Unicode文件 在Python 3.0中读取和写入Unicode 在Python 3.0中处理BOM Python 2.6中的Unicode文件 Python 3.0中其他字符串工具的变化 re模式匹配模块 Struct二进制数据模块 pickle对象序列化模块 XML解析工具 本章小结 本章习题 习题解答 第37章 管理属性 为什么管理属性 插入在属性访问时运行的代码 特性 基础知识 第一个例子 计算的属性 使用装饰器编写特性 描述符 基础知识 第一个示例 计算的属性 在描述符中使用状态信息 特性和描述符是如何相关的 __getattr__和__getattribute__ 基础知识 第一个示例 计算属性 __getattr__和__getattribute__比较 管理技术比较 拦截内置操作属性 重访基于委托的Manager 示例:属性验证 使用特性来验证 使用描述符验证 使用__getattr__来验证 使用__getattribute__验证 本章小结 本章习题 习题解答 第38章 装饰器 什么是装饰器 管理调用和实例 管理函数和类 使用和定义装饰器 为什么使用装饰器 基础知识 函数装饰器 类装饰器 装饰器嵌套 装饰器参数 装饰器管理函数和类 编写函数装饰器 跟踪调用 状态信息保持选项 类错误之一:装饰类方法 计时调用 添加装饰器参数 编写类装饰器 单体类 跟踪对象接口 类错误之二:保持多个实例 装饰器与管理器函数的关系 为什么使用装饰器(重访) 直接管理函数和类 示例:“私有”和“公有”属性 实现私有属性 实现细节之一 公有声明的泛化 实现细节之二 开放问题 Python不是关于控制 示例:验证函数参数 目标 针对位置参数的一个基本范围测试装饰器 针对关键字和默认泛化 实现细节 开放问题 装饰器参数 VS 函数注解 其他应用程序:类型测试 本章小结 本章习题 习题解答 第39章 元类 要么是元类,要么不是元类 提高魔力层次 “辅助”函数的缺点 元类与类装饰器的关系:第一回合 元类模型 类是类型的实例 元类是Type的子类 Class语句协议 声明元类 编写元类 基本元类 定制构建和初始化 其他元类编程技巧 实例与继承的关系 示例:向类添加方法 手动扩展 基于元类的扩展 元类与类装饰器的关系:第二回合 示例:对方法应用装饰器 用装饰器手动跟踪 用元类和装饰器跟踪 把任何装饰器应用于方法 元类与类装饰器的关系:第三回合 “可选的”语言功能 本章小结 本章习题 习题解答 第九部分 附录注 附录A 安装和配置 附录B 各部分练习题的解答
第36章 Unicode和字节字符串 在本书的核心类型部分关于字符串的一章中(第7章),我有意地限制了大多数 Python 程序员需要了解的字符串话题的子集的范围。因为大多数程序员只是处理像ASCI这样 的文本的简单形式,他们快乐地使用着 Python的基本的str字符串类型及其相关的操作, 并且不需要掌握更加高级的字符串概念。实际上,这样的程序员很大程度上可以忽略 Python3.0中的字符串的变化,并且继续使用他们过去所使用的字符串。 另一方面,一些程序员处理更加专业的数据类型:非 ASCII的字符串集、图像文件内 容,等等。对于这些程序员(以及其他可能某一天加入这一队伍的程序员),在本章 中,我们将介绍 Python字符串的其他内容,并且探讨 Python字符串模型中一些较为高级 的话题。 特别是,我们将介绍 Python支持的 Unicode文本的基础知识在国际化应用程序中使用 的宽字符字符串,以及二进制数据——表示绝对的字节值的字符串。我们将看到,高级 的字符串表示法在 Python当前版本中已经产生了分歧: Python3.为二进制数据提供了一种替代字符串类型,并且在其常规的字符串类型 中支持 Unicode文本(ASCI看作 Unicode的一种简单类型)。 · Python26为非 ASCII Unicode文本提供了一种替代字符串类型,并且在其常规的字 符串类型中支持简单文本和二进制数据 此外,由于 Python的字符串模式对于如何处理非ASCI文件有着直接的影响,我们还将 在这里介绍相关话题的基础知识。最后,我们还将简单地看看一些高级字符串和二进制 工具,例如模式匹配、对象 pickle化、二进制数据包装和ⅩML解析,以及 Python3.0的字 符串变化对它们产生影响的方式。 893 正式来说,本章是关于高级话题的一章,因为并不是所有的程序员都需要深入 Unicode 编码或二进制数据的世界。如果你需要关注处理这两种形式,那么,你将会发现 Python 的字符串模式提供了所需的支持。 Python3.0中的字符串修改 Python3.0中最引入注目的修改之一,就是字符串对象类型的变化。简而言之, Python 2X的str和 unicode类型已经融入了 Python3.0的str和 bytes类型,并且增加了一种新的 可变的类型 bytearray。 bytearray类型在 Python26中也可以使用(但在更早的版本中 不能用),但是,它在 Python3.0中得到完全支持,并且不像是 Python2.6中那样清楚地 区分文本和二进制内容。 特别是,如果我们处理本质上是 Unicode或二进制的数据,这些修改对于代码可能会有 切实的影响。实际上,作为首要的一般性规则,我们需要如何关注这一话题,很大程度 上取决于遇到如下的哪种情况 如果处理非 ASCII Unicode文本,例如,在国际化应用程序或某些XML解析器的结 果这样的环境中,你将会发现 Python3.0中对文本编码的支持是不同的,但是可能 比 Python2.6中的支持更加直接、易用和无缝。 ·如果处理二进制数据,例如,使用 struct模块处理的图形或音频文件的形式或打包 的数据,我们需要理解 Python3.0中新的 bytes对象,以及 Python3.0对文本和二进制 数据和文件的不同和严格区分 如果不属于前面两种情况的任何一种,在 Python3.0中,通常可以像是在 Python 2.6中一样使用字符串:使用通用的str字符串类型、文本文件,以及我们前面所 介绍的所有熟悉的字符串操作。字符串将使用平台默认的编码来进行编码和解 码(例如,美国的 Windows上的ASCI或UTF-8,如果我们仔细检查的话,Sys getdefaultencoding()给出默认的编码方式),但是,你可能不会注意 换句话说,如果你的文本总是ASCI,可以使用常规的字符串对象和文本文件,并且避 免下面介绍的大多数情况。正如稍后我们将见到的,ASCI是一种简单的 Unicode,并且 是其他编码的一个子集,因此,如果你的程序处理ASCI文本,字符串操作和文件“刚 好够用”。 即便你遇到了刚刚提及的3种情况的最后一种,然而对 Python3.0字符串模式的基本理 解,既可以帮助你理解一些底层的行为,也可以帮助你更容易地掌握 Unicode或二进制 数据问题,以免它们将来会影响到你 894第36章 Python3.0对 Unicode和二进制数据的支持在 Python26中也可以使用,虽然形式不同。 尽管本章中主要关注的是 Python3.0中的字符串类型,在此过程中,我们还将讨论一些 Python2.6中的不同之处。不管你使用的是哪个版本,我们在这里介绍的工具在很多类 型程序中将变得重要起来。 字符串基础知议 在査看任何代码之前,让我们先开始概览一下 Python的字符串模型。要理解为什么 Python3.0改变了字符串的工作方式,我们必须先简短地看看字符实际是如何在计算机 中表示的。 字符编码方法 大多数程序员把字符串看作是用来表示文本数据的一系列字符。但是,根据必须记录何 种字符集,计算机内存中存储字符的方式有所不同。 ASCI标准在美国创建,并且定义了大多数美国程序员使用的文本字符串表示法。ASCI 定义了从0到127的字符代码,并且允许每个字符存储在一个8位的字节中(实际上,只 有其中的7位真正用到)。例如,ASCI标准把字符'a"映射为整数值97(十六进制中 的0x61),它存储在内存和文件的一个单个字节中。如果想要看到这是如何工作的, Python的内置函数ord给出了一个字符的二进制值,并且chr针对一个给定的整数代码值 返回其字符 >>ord('a") a' is a byte with binary value 97 in ASCll 97 >>hex(97) 0X61 >>chr(97) Binary value 97 stands for character a 然而,有时候每个字符一个字节并不够。例如,各种符号和重音字符并不在ASCI所定 义的可能字符的范围中。为了容纳特殊字符,一些标准允许一个8位字节中的所有可能 的值(即0到255)来表示字符,并且把(ASCI范围之外的)值128到25分配给特殊字 符。这样的一个标准叫做 Latin-l,广泛地用于西欧地区。在 Latin-1中,127以上的字符 代码分配给了重音和其他特殊字符。例如,分配给字节值196的字符,是一个特殊标记 的非ASCI字符 >>>0XC4 196 >>chr(196) A Unicode和字节字符串895 这个标准考虑到范围较广的额外特殊字符。然而,一些字母表定义了如此多的字符,以 至于无法把其中的每一个都表示成一个字节。 Unicode考虑到更多的灵活性。 Unicode文 本通常叫做“宽字符”字符串,因为每个字符可能表示为多个字节。 Unicode通常用在 国际化的程序中,以表示欧洲和亚洲的字符集,它们往往拥有比8位字节所能表示的更 多的字符。 要在计算机内存中存储如此丰富的文本,我们要确保字符与原始字节之间可以使用一种 编码相互转换,而编码就是把一个 Unicode字符转换为字节序列以及从一个字节序列提 取字符串的规则。更程序化地说,字节和字符串之间的来回转换由两个术语定义: 编码是根据一个想要的编码名称,把一个字符串翻译为其原始字节形式 ·解码是根据其编码名称,把一个原始字节串翻译为字符串形式的过程。 也就是说,我们从字符串编码为原始字节,并且从原始字节解码为字符串。对于某些 编码,翻译的过程很简单,例如ASCI和 Latin-1,把每个字符映射为一个单个字节,因 此,不需要翻译工作。对于其他的编码,映射可能更复杂些,并且每个字符产生多个字 节 例如,广为使用的UTF-8编码,通过采用可变的字节数的方案,允许表示众多的字符 小于128的字符代码表示为单个字节;128和0x7ff(2047)之间的代码转换为两个字节,而 每个字节拥有一个128到255之间的值;0x7f上的代码转换为3个或4个字节序列,序列 中的每个字节的值在128到255之间。这保持了ASCI字符串的紧凑,避免了字节排序问 题,并且避免了可能对C库和网络连接引发问题的空(零)字节。 由于编码的字符映射把字符分配给同样的代码以保持兼容性,因此ASCI是 Latin-1和 UTF-8的子集。也就是说,一个有效的ASCI字符串也是一个有效的 Latin-1和UTF8编码 字符串。当数据存储到文件中的时候,这也是成立的:每个ASCI文件也是有效的UTF8 文件,因为ASCI是UTF8的一个7位的子集。 反过来,对于所有小于128的字符代码,UTF-8编码与 ASCIL是二进制兼容的。 Latin-1 和UTF8只不过是考虑到了额外的字符: Latin-1是为了在一个字节内映射为128到255的 值,UTF-8是考虑到可能用多个字节表示的字符串。其他的编码以类似的方式允许较宽 的字符集合,但是,所有这些, ASCII、 Latin-1、UTF-8以及很多其他的编码,都被认 为是 Unicod 对于 Python程序员来说,编码指定为包含了编码名的字符串。 Python带有大约100种不 同的编码,参见 Python库参考可以找到一个完整的列表。导入 encodings模块并运行 help( encodings)也会显示很多的编码名称,一些是在 Python中实现的,一些是在C中 实现的。一些编码也有多个名称,例如, latin-l、iso_88591和8859都是相同编码的名 896 第36章 称,即 Latin-1。我们将会在本章稍后学习在脚本中编写 Unicode字符串技术的时候,再 次介绍编码。 要了解关于 Unicode的更多内容,参见 Python标准手册集。它在“ Python HOWTOS”部 分包括了一个“ Unicode howto”,其中提供了额外的背景知识,考虑到篇幅的问题, 我们暂时在此省略。 Python的字符串类型 具体来说, Python语言提供了字符串类型在脚本中表示字符文本。在脚本中所使用的字 符串类型取决于所使用的 Python的版本。 Python2X有一种通用的字符串类型来表示二进 制数据和像ASCI这样的8位文本,还有一种特定的类型用来表示多字节 Unicode文本 str表示8位文本和二进制数据。 · unicode用来表示宽字符 Unicode文本。 Python2.X的两种字符串类型是不同的( unicode考虑到字符的额外大小并且支持编码和 解码),但是,它们的操作集大多是重叠的。 Python2.X中的str字符串类型用于可以用8 位字节表示的文本,以及绝对字节值所表示的二进制数据。 相反, Python3X带有3种字符串对象类型 种用于文本数据,两种用于二进制数 据: str表示 Unicode文本(8位的和更宽的) bytes表示二进制数据。 bytearray 是一种可变的 bytes类型 正如前面所提到的, bytearray在 Python2.6中可以使用,但它是从 Python30才有的升级 功能,此后较少有特定内容的行为,并且通常看做是一个 Python30类型。 Python3.0中所有3种字符串类型都支持类似的操作集,但是,它们都有不同的角色。 Python3X之后关于这一修改的主要目标是,把 Python2X中常规的和 Unicode字符串 类型合并到一个单独的字符串类型中,以支持常规的和 Unicode文本:开发者想要删除 Python2X中的字符串区分,并且让 Unicode的处理更加自然。假设ASCI和其他的8位文 本真的是一种简单的 Unicode,这种融合听起来很符合逻辑。 为了实现这一点, Python3.0的str类型定义为一个不可改变的字符序列(不一定是字 节),这可能是像ASCI这样的每个字符一个字节的常规文本,或者是像UTF8 Unicode 这样可能包含多字节字符的字符集文本。你的脚本所使用的字符串处理,带有这种每个 Unicode和字节字符串897 平台默认编码的类型,但是,在内存中以及在文件之间来回转换的时候,将会提供明确 的编码名,以便在str对象和不同的方案之间来回转换。 尽管 Python3.0新的str类型确实实现了想要的字符串儿 Unicode结合,但很多程序仍然 需要处理那些没有针对毎个任意文本格式都编码的raw字节数据。图像和声音文件,以 及用来与设备接口的打包数据,或者你想要用 Python的 struct模块处理的C程序,都属 于这一类型。因此,为了支持真正的二进制数据的处理,还引入了一种新的类型,即 bytes。 在 Python2X中,通用的str类型填补了二进制数据的这一角色,因为字符串也只是字节 的序列(单独的 unicode类型处理宽字符串)。在 Python30中, bytes类型定义为一个8 位整数的不可变序列,表示绝对的字节值。此外, Python3.0的 bytes类型支持几乎str 类型所做的所有相同操作:这包括字符串方法、序列操作,甚至re模块模式匹配;但是 不包括字符串格式化 个 Python3.0 bytes对象其实只是较小整数的一个序列,其中每个整数的范围都在0 到255之间;索引一个 bytes将返回一个int,分片一个 bytes将返回另一个 bytes,并 且在一个 bytes上运行内置函数1ist将返回整数,而不是字符的一个列表。当用那些假 设字符的操作处理 bytes的时侯, bytes对象的内容被假设为ASCI工编码的字节(例如, isa1pha方法假设每个字节都是一个ASCI字符代码)。此外,为了方便起见, bytes对 象打印为字符串而不是整数。 尽管如此, Python的开发者也在 Python30中添加了一个 bytearray类型, bytearray是 bytes类型的一个变体,它是可变的并且支持原处修改。它支持str和 bytes所支持的常 见的字符串操作,以及和列表相同的很多原处修改操作(例如, append和 extend方法, 以及向索引赋值)。假设字符串可以作为raw字节对待, bytearray最终为字符串数据添 加了直接原处可修改的能力,这在 Python20中不通过转换为一个可变类型是不可能做 到的,并且也是 Python3.0的str或 bytes所不支持的。 尽管 Python2.6和 Python3.0提供了很多相同的功能,但它们还是以不同方式包装了功 能。实际上,从 Python26到 Python3.0的字符串类型映射并不是直接的, Python2.8的 str等同于 Python3.0中的str和 bytes,并且 Python3.0的str等同于 Python2.6中的str和 Unicode。此外, Python3.0的可变的 bytearray是独特的。 然而,实际上,这种不对称并不像听上去那么令人生畏。它可以概括如下:在 Python 26中,我们可以对简单的文本使用str并且对文本的更高级的形式使用二进制数据和 unicode;在 Python3.0中,我们将针对任何类型的文本(简单的和 Unicode)使用str 并且针对二进制数据使用 bytes或 bytearray。实际上,这种选择常常由你所使用的工具 决定,尤其是在文件处理工具的例子中,这是下一小节的主题。 898 第36章 文本和二进制文件 文件IO(输入和输出)在 Python3.0中也有所改进,以反映str/ bytes的区分以及对编码 Unicode文本的自动支持。 Python现在在文本文件和二进制文件之间做了一个明显的独立 于平台的区分 文本文件 当一个文件以文本模式打开的时候,读取其数据会自动将其内容解码(每个平台 个默认的或一个提供的编码名称),并且将其返回为一个str,写入会接受一个 str,并且在将其传输到文件之间自动编码它。文本模式的文件还支持统一的行尾 转换和额外的编码特定参数。根据编码名称,文本文件也自动处理文件开始处的字 节顺序标记序列(稍后详细介绍)。 二进制文件 通过在内置的open调用的模式字符串参数添加一个b(只能小写),以二进制模式 打开一个文件的时候,读取其数据不会以任何方式解码它,而是直接返回其内容 raw并且未经修改,作为一个 bytes对象;写入类似地接受一个 bytes对象,并且将 其传送到文件中而未经修改。二进制模式文件也接受一个 bytearray对象作为写入 文件中的内容。 由于str和 bytes之间的语言差距明显,所以必须确定数据本质上是文本或二进制,并且 在脚本中相应地使用str或 bytes对象来表示其内容。最终,以何种模式打开一个文件将 决定脚本使用何种类型的对象来表示其内容 ·如果正在处理图像文件,其他程序创建的、而且必须解压的打包数据,或者一些设 备数据流,则使用 bytes和二进制模式文件处理它更合适。如果想要更新数据而不 在内存中产生其副本,也可以选择使用 bytearray。 如果你要处理的内容实质是文本的内容,例如程序输出、HTML、国际化文本或 CSⅤ或XML文件,可能要使用str和文本模式文件。 注意,内置函数open的模式字符串参数(函数的第二个参数)在 Python30中变得至关 重要,因为其内容不仅指定了一个文件处理模式,而且暗示了一个 Python对象类型。 通过给模式字符串添加一个b,我们可以指定二进制模式,并且当读取或写入的时候, 将要接收或者必须提供一个 bytes对象来表示文件的内容。没有b,我们的文件将以文 本模式处理,并且将使用str对象在脚本中表示其内容。例如,模式rb、wb和rb+暗示 bytes,而r、W和rt暗示str。 文夲模式文件也处理在某种编码方案下可能岀现在文件开始处的字节顺序标记(byte order marker,BOM)序列。例如,在UTF-16和UTF-32编码中,BOM指定大尾还是小 Unicode和字节字符串899 尾格式(基本上,是确定一个位字符串的哪一端最重要)。一般来说,一个UTF8文本 文件也包含了一个BOM来声明它是UTF-8,但并不保证这样。当使用这些编码方法来读 取和写入数据的时候,如果BOM有一个通用的编码暗示或者如果提供一个更为具体的编 码名来强制这点的话, Python会自动省略或写出BOM。例如,BOM总是针对“utf16” 处理,更具体的编码名“utf-16-le”表示小尾UTF-16格式,更具体的编码名“utf-8 sig”迫使 Python在输入和输出上分别都针对UTF-8文本省略并写入一个BOM(通用名称 utf-8”并不这么做)。 我们还将在本章后面的“在 Python30中处理BOM”一节中介绍更多有关BOM和文件的 内容。首先,让我们探讨 Python的新的 Unicode字符串模型的含义 Python3中的字符串应用 让我们再看一些例子,这些例子展示了如何使用 Python3.0字符串类型。提前强调 点:本节中的代码都只在 Python3.0下运行和使用。然而,基本的字符串操作通常在 Python各版本中是可移植的。用str类型表示的简单的ASCI符串在 Python26和 Python 3.0下都能工作(并且确实像我们在本书第7章中所见到的那样)。此外,尽管 Python2.6 中没有 bytes类型(它只有通用的str),它通常按照这样的方式来运行代码:在 Python 2.6中,调用 bytes(X)作为str(X)的同义词出现,并且新的常量形式b'..'看做与常量 ..'相同。然而,我们仍然可能在一些个别的例子中遇到版本差异;例如, Python2.6 的 bytes调用,不允许 Python3.0中 bytes所要求的第二个参数(编码名称) 常量和基本属性 当调用str或 bytes这样的一个内置函数的时候,会引发 Python30字符串对象,来处理 调用open(下一小节介绍)所创建的一个文件,或者在脚本中编写常量语法。对于后 者,一种新的常量形式b'xxx'(以及对等的B'xxx2)用来创建 Python30中的 bytes对 象, bytearray对象可能通过调用 bytearray函数来创建,这会带有各种可能的参数 更正式地说,在 Python3.0中,所有当前字符串常量形式,'xxx'、"xxx"和三引号字符 串块,都产生一个str;在它们任何一种前面添加一个b或B,则会创建一个 bytes。这个 新的b'..字节常量类似于用来抑制反斜杠转义的r raw字符串。考虑在 Python 3.0中运行如下语句 C: \misc> c: \python30\python >>B=b’spam f Make a bytes object (8-bit bytes) g85 Make a str object(Unicode characters, 8-bit or wider >>>type (B), type(s) 900第36章

...展开详情
试读 127P Python学习手册(第4版)-第8部分&附录.pdf )
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
qq_34939727 。。。不全
2018-10-20
回复
ptmagic 很赞,坑爹的出版社
2016-01-15
回复
BlueblueWings 这本书带我python入门,内容浅显易懂又不乏深度,非常好!
2015-08-24
回复
nanyoullm 怎么说吧,一般般,建议大家上codecademy学习python
2015-05-14
回复
fanwei_1225 很不错, 补全了缺的部分。
2015-05-07
回复
maikeerqiao 非常好 内容详细具体
2015-04-27
回复
chenjian_w 非常不错,题目解答很好
2014-12-29
回复
registcn 其实这部分东西比较重要的,如果看一些开云项目,这里的好多知识点必备的
2014-10-24
回复
shengshengwang 正是想要的!
2014-07-12
回复
LBS周刊 谢谢分享, 出版社说到他们网站下, 结果根本就没有. 我下载下来到淘宝上打印了一下. 非常不错.
2014-06-05
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
Python学习手册(第4版)-第8部分&附录.pdf ) 9积分/C币 立即下载
1/127
Python学习手册(第4版)-第8部分&附录.pdf )第1页
Python学习手册(第4版)-第8部分&附录.pdf )第2页
Python学习手册(第4版)-第8部分&附录.pdf )第3页
Python学习手册(第4版)-第8部分&附录.pdf )第4页
Python学习手册(第4版)-第8部分&附录.pdf )第5页
Python学习手册(第4版)-第8部分&附录.pdf )第6页
Python学习手册(第4版)-第8部分&附录.pdf )第7页
Python学习手册(第4版)-第8部分&附录.pdf )第8页
Python学习手册(第4版)-第8部分&附录.pdf )第9页
Python学习手册(第4版)-第8部分&附录.pdf )第10页
Python学习手册(第4版)-第8部分&附录.pdf )第11页
Python学习手册(第4版)-第8部分&附录.pdf )第12页
Python学习手册(第4版)-第8部分&附录.pdf )第13页
Python学习手册(第4版)-第8部分&附录.pdf )第14页
Python学习手册(第4版)-第8部分&附录.pdf )第15页
Python学习手册(第4版)-第8部分&附录.pdf )第16页
Python学习手册(第4版)-第8部分&附录.pdf )第17页
Python学习手册(第4版)-第8部分&附录.pdf )第18页
Python学习手册(第4版)-第8部分&附录.pdf )第19页
Python学习手册(第4版)-第8部分&附录.pdf )第20页

试读结束, 可继续阅读

9积分/C币 立即下载