一.
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
可更改
映射访问