- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非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 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
第4章 介绍 Python 对象类型
从更正式的角度来讲,在Python中,数据以对象的形式出现——无论是Python提供的内置对象,还是使用Python或是像C扩展库这样的扩展语言工具创建的对象。尽管在以后才能确定这一概念,但对象无非是内存中的一部分,包含数值和相关操作的集合。
由于对象是Python中最基本的概念,从这一章开始我们将会全面地体验Python的内置对象类型。
通过这样的介绍,让我们先来简单地说明这一章如何符合Python全景。从更具体的视角来看,Python程序可以分解成模块、语句、表达式以及对象,如下所示。
1.程序由模块构成。
2.模块包含语句。
3.语句包含表达式。
4.表达式建立并处理对象。
在第3章中对模块的讨论介绍了这个等级层次中的最高一层。本部分的章节将会从底层开始,探索编程过程中使用的内置对象以及表达式。
为什么使用内置类型
如果你使用过底层语言C或C++,应该知道很大一部分工作集中于用对象(或者叫做数据结构)去表现应用领域的组件。需要部署内存结构、管理内存分配、实现搜索和读取例程等。这些工作听起来非常乏味(且容易出错),并且往往背离程序的真正目标。
在典型的Python程序中,这些令人头痛的大部分工作都消失了。因为Python提供了强大的对象类型作为语言的组成部分,在你开始解决问题之前往往没有必要编写对象的实现。事实上,除非你有内置类型无法提供的特殊对象要处理,最好总是使用内置对象而不是使用自己的实现。下面是其原因。
·内置对象使程序更容易编写。对于简单的任务,内置类型往往能够表现问题领域的所有结构。免费得到了如此强大的工具,例如,集合(列表)和搜索表(字典),可以马上使用它们。仅使用Python内置对象类型就能够完成很多工作。
·内置对象是扩展的组件。对于较为复杂的任务,或许仍需要提供你自己的对象,使用Python的类或C语言的接口。但就像本书稍后要介绍的内容,人工实现的对象往往建立在像列表和字典这样的内置类型的基础之上。例如,堆栈数据结构也许会实现为管理和定制内置列表的类。
·内置对象往往比定制的数据结构更有效率。在速度方面,Python的内置类型优化了用C实现数据结构算法。尽管可以实现属于自己的类似的数据类型,但往往很难达到内置数据类型所提供的性能水平。
·内置对象是语言的标准的一部分。从某种程度上来说,Python不但借鉴了依靠内置工具的语言(例如,LISP),而且汲取了那些依靠程序员去提供自己实现的工具或框架的语言(例如,C++)的优点。尽管在Python中可以实现独一无二的对象类型,但在开始阶段并没有必要这样做。此外,因为Python的内置工具是标准的,它们一般都是一致的。另一方面,独创的框架则在不同的环境都有所不同。
换句话说,与我们从零开始所创建的工具相比,内置对象类型不仅仅让编程变得更简单,而且它们也更强大和更高效。无论你是否实现新的对象类型,内置对象都构成了每一个Python程序的核心部分。
Python的核心数据类型
表4-1是Python的内置对象类型和一些编写其常量(literal)所使用到的语法,也就是能够生成这些对象的表达式[1]。如果你使用过其他语言,其中的一些类型也许对你来说很熟悉。例如,数字和字符串分别表示数字和文本的值,而文件则提供了处理保存在计算机上的文件的接口。
表4-1所列内容并不完整,因为在Python程序中处理的每样东西都是一种对象。例如,在Python中进行文本模式匹配时,创建了模式对象,还有进行网络脚本编程时,使用了套接字对象。其他类型的对象往往都是通过导入或使用模块来建立的,而且它们都有各自的行为。
我们将在本书稍后的部分介绍,像函数、模块和类这样的编程单元在Python中也是对象,它们由def、class、import和lambda这样的语句和表达式创建,并且可以在脚本间自由地传递,存储在其他对象中等。Python还提供了一组与实现相关的类型,例如编译过的代码对象,它们通常更多地关系到工具生成器而不是应用程序开发者;本书后续部分也将讨论它们。
我们通常把表4-1中的对象类型称作是核心数据类型,因为它们是在Python语言内部高效创建的,也就是说,有一些特定语法可以生成它们。例如,运行下面的代码:
从技术上讲,你正在运行一个常量表达式,这个表达式生成并返回一个新的字符串对象。这是Python用来生成这个对象的一个特定语法。类似地,一个方括号中的表达式会生成一个列表,大括号中的表达式会建立一个字典等。尽管这样,就像我们看到的那样,Python中没有类型声明,运行的表达式的语法决定了创建和使用的对象的类型。事实上,在Python语言中,诸如表4-1中的那些对象生成表达式就是这些类型起源的地方。
同等重要的是,一旦创建了一个对象,它就和操作集合绑定了——只可以对字符串进行字符串相关的操作,对列表进行列表相关的操作。就像你将会学到的,Python是动态类型的(它自动地跟踪你的类型而不是要求声明代码),但是它也是强类型语言(你只能对一个对象进行适合该类型的有效的操作)。
在功能上,表4-1中的对象类型可能比你习惯的类型更常用,也更强大。例如,你会发现列表和字典就是强大的数据表现工具,省略了在使用底层语言的过程中为了支持集合和搜索而引入的绝大部分工作。简而言之,列表提供了其他对象的有序集合,而字典是通过键存储对象的。列表和字典都可以嵌套,可以随需求扩展和删减,并能够包含任意类型的对象。
我们将会在后续章节学习表4-1中的每一种对象类型。在深入介绍细节之前,我们迅速地浏览在实际应用中的Python的核心对象。本章的余下部分将提供一些操作,而在本章以后的章节我们将会更深入地学习这些操作。别指望在这里能够找到所有的答案。本章的目的仅仅是激发你学习的欲望并介绍一些核心的概念。好了,最好的入门方法就是迈出第一步,所以让我们看一些真正的代码吧。
[1]本书中,常量(literal)是指其语法会生成对象的表达式,有时也叫做常数(constant)。值得注意的是,“常数”不是指不可变的对象或变量(这个术语与在C++中的const,或Python中的“不可变”这个概念没有什么关系;本章稍后会讨论这个概念)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论