python核心编程第二版第四章学习笔记

一. Python 对象
Python 使用对象模型来存储数据。构造任何类型的值都是一个对象。
所有的Python 对像都拥有三个特性: 身份 类型
身份:id号。也就是地址
二.对象属性
最常用 的对象属性是函数和方法,不过有一些Python 类型也有数据属性。含有数据属性的对象包括(但不 限于):类、类实例、模块、复数和文件。
标准类型
�� 数字(分为几个子类型,其中有三个是整型)
�� 整型
�� 布尔型
�� 长整型
�� 浮点型
�� 复数型
�� 字符串
�� 列表
�� 元组
�� 字典
四. 其他内建类型
�� 类型
�� Null 对象 (None)
�� 文件
�� 集合/固定集合
�� 函数/方法
�� 模块
��
1.类型对象和type 类型对象
通过调用type()函数你能够得到特定对象的类型 信息:
>>> type(42)
实际上是一个类型对象 ,碰巧它输出了一个字符串来告诉你 它是个int 型对象。
类型对象的类型:
>>> type(type(42))
因此类型对象的类型为type型对象
2. None, Python 的 Null 对象
Python 有一个特殊的类型,被称作 Null 对象或者 NoneType,它只有一个值,那就是 None。 它不支持任何运算也没有任何内建方法。
None 没有什么有用的属性,它的布尔值总是False。
核心笔记:布尔值
所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布
尔 True 或 False 值。空对象、值为零的任何数字或者Null 对象 None 的布尔值都是False。
下列对象的布尔值是False。
�� None
�� False (布尔类型)
�� 所有的值为零的数:
�� 0 (整型)
�� (浮点型)
�� 0L (长整型)
�� 0.0+0.0j (复数)
�� "" (空字符串)
�� [] (空列表)
�� () (空元组)
�� {} (空字典)
值不是上面列出来的任何值的对象的布尔值都是 True,例如non-empty、 non-zero 等等。
用户创建的类实例如果定义了nonzero(__nonzero__())或length(__len__())且值为0,那 么它们的布尔值就是 False。
3. 内部类型
�� 代码
��
�� 跟踪记录
�� 切片
�� 省略
�� Xrange
1)代码对象
代码对象是编译过的Python 源代码片段,它是可执行对象。通过调用内建函数compile() 可以得到代码对象。代码对象可以被 exec 命令或 eval()内建函数来执行。
(2) 帧对象
帧对象表示 Python 的执行栈帧。帧对象包含Python 解释器在运行时所需要知道的所有信 息。它的属性包括指向上一帧的链接,正在被执行的代码对象(参见上文),本地及全局名字空 间字典以及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个C 栈 帧。用到帧对象的一个地方是跟踪记录对象。
(3) 跟踪记录 对象
当你的代码出错时, Python 就会引发一个异常。如果异常未被捕获和处理, 解释器就会 退出脚本运行,显示类似下面的诊断信息:
Traceback (innermost last):
File "", line N?, in ???
ErrorName: error reason
当异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建。如果一个异常有 自己的处理程序,处理程序就可以访问这个跟踪记录对象。
(4) 切片对象
当使用Python 扩展的切片语法时,就会创建切片对象。扩展的切片语法允许对不同的索引 切片操作,包括步进切片, 多维切片,及省略切片。多维切片语法是 sequence[start1 : end1, start2 : end2], 或使用省略号, sequence[...,start1 : end1 ]. 切片对象也可以由内建 函数 slice()来生成。步进切片允许利用第三个切片元素进行步进切片,它的语法为 sequence[起始索引 : 结束索引 : 步进值]。
(5) 省略对象
省略对象用于扩展切片语法中,起记号作用。 这个对象在切片语法中表示省略号。类似 Null 对象 None, 省略对象有一个唯一的名字 Ellipsis, 它的布尔值始终为 True.
(6) XRange 对象
调用内建函数 xrange() 会生成一个Xrange 对象,xrange()是内建函数 range()的兄弟版 本, 用于需要节省内存使用或 range()无法完成的超大数据集场合。

五. 标准类型运算符
核心提示:实践
整数对象和 字符串对象是不可变对象,所以Python 会很高效的缓存它们。这会造成我们认为Python 应该 创建新对象时,它却没有创建新对象的假象。看下面的例子:
>>> a = 1
>>> id(a)
8402824
>>> b = 1
>>> id(b)
8402824
>>>
>>> c = 1.0
>>> id(c)
8651220
>>> d = 1.0
>>> id(d)
8651204
在上面的例子中,a 和 b 指向了相同的整数对象,但是 c 和 d 并没有指向相同的浮点数 对象。如果我们是纯粹主义者,我们会希望 a 与 b 能和 c 与 d 一样,因为我们本意就是为 了创建两个整数对象,而不是像 b = a 这样的结果。 Python 仅缓存简单整数,因为它认为在Python 应用程序中这些小整数会经常被用到。
六.标准类型内建函数
标准类型内建函数
除了这些运算符, 我们刚才也看到, Python 提供了一些内建函数用于这些基本对象类型:
cmp(), repr(), str(), type(), 和等同于repr()函数的 单反引号(``) 运算符。
举例:

>>> str([0, 5, 9, 9])
'[0, 5, 9, 9]'
>>>
>>> repr([0, 5, 9, 9])
'[0, 5, 9, 9]'
>>>
>>> `[0, 5, 9, 9]`
'[0, 5, 9, 9]'

str(),repr()和``运算在特性和功能方面都非常相似, 事实上 repr() 和 `` 做的 是完全一样的事情,它们返回的是一个对象的“官方”字符串表示, 也就是说绝大多数情况下 可以通过求值运算(使用eval()内建函数)重新得到该对象,但str()则有所不同。str() 致力 于生成一个对象的可读性好的字符串表示,它的返回结果通常无法用于eval()求值, 但很适 合用于 print 语句输出。需要再次提醒一下的是, 并不是所有repr()返回的字符串都能够用 eval()内建函数得到原来的对象:
>>> eval(`type(type))`)
File "", line 1
eval(`type(type))`)
^
SyntaxError: invalid syntax
核心笔记:为什么我们有了repr()还需要``?
在Python 学习过程中,你偶尔会遇到某个运算符和某个函数是做同样一件事情。之所以如 此是因为某些场合函数会比运算符更适合使用。举个例子, 当处理类似函数这样的可执行对象 或根据不同的数据项调用不同的函数处理时,函数就比运算符用起来方便。另一个例子就是双 星号(**)乘方运算和pow()内建函数,x ** y 和 pow(x,y) 执行的都是x 的y 次方。
译者注:事实上Python 社区目前已经不鼓励继续使用``运算符。

减少函数调用的次数
要知道每次调用函数 都会付出性能代价, 如果我们能减少函数的调用次数, 就会提高程序的性能。
六. 标准类型的分类
1.存储类型
我们对类型进行分类的第一种方式, 就是看看这种类型的对象能保存多少个对象。Python 的类型, 就象绝大多数其它语言一样,能容纳一个或多个值。一个能保存单个字面对象的类型 我们称它为原子或标量存储,那些可容纳多个对象的类型,我们称之为容器存储。
以存储模型为标准的类型分类
存储模型
分类                Python 类型
标量/原子类型       数值(所有的数值类型),字符串(全部是文字)
容器类型            列表、元组、字典
2.更新类型
另一种对标准类型进行分类的方式就是, 针对每一个类型问一个问题:“对象创建成功之 后,它的值可以进行更新吗?” 在前面我们介绍Python 数据类型时曾经提到, 某些类型允许 他们的值进行更新,而另一些则不允许。可变对象允许他们的值被更新,而不可变对象则不允 许他们的值被更改。
以更新模型为标准的类型分类
更新模型
分类                   Python 类型
可变类型               列表, 字典
不可变类型             数字、字符串、元组
3. 访问模型
根据访问我们存储的数据的方式对数据类型进 行分类    。在访问模型中共有三种访问方式:直接存取,顺序,和映射。
以访问模型为标准的类型分类
访问模型
分类              Python 类型
直接访问          数字
顺序访问          字符串、列表、元组
映射访问          字典
总结
数据类型      存储模型     更新模型   访问模型 l
数字            Scalar              不可更改    直接访问
字符串         Scalar              不可更改   顺序访问
列表            Container        可更改      顺序访问
元组            Container        不可更改    顺序访问
字典            Container        可更改     映射访问





你可能感兴趣的:(python,python,编程)