1 python对象
Python使用对象模型来存储数据,构造任何类型的值都是一个对象。
Python中所有的对象都有三个特性:身份,类型和值
身份:
每一个对象都有一个唯一的身份标识自己,即该对象的内存地址,该地址可以用内建函数id()来获得,比如:
>>> id(1)
39846232
>>> id('a')
140200776980120
类型:
对象的类型决定了该对象可以保存什么样的数据,可以用内建函数type()来获得对象的类型,type()函数返回的是一个type类型的对象,而不是一个字符串。
>>> type(1)
<type 'int'>
>>> type('a')
<type 'str'>
而type()返回的类型为type对象:
>>> type(type(1))
<type 'type'>
值:
对象表示的数据项。
对象的这三个属性,在对象创建的时候就会被赋值
2 标准类型
标准类型,也叫基本数据类型,有:
- 整型 int
- 布尔型 bool
- 长整型 long
- 浮点型 float
- 复数型 complex
- 字符串 string
- 列表 list
- 元组 tuple
- 字典 dictionary
这些类型是python内建的基本数据类型。
3 其他内建类型
- 类型 type
- Null 对象 None
- 文件
- 集合/固定集合
- 函数/方法
- 模块
- 类
3.1 类型对象和type类型对象
在python中,把所有的python对象的类型都当成了对象,类型对象中保存了对象的一些固有特征,比如说支持哪些运算,具有哪些方法等。所以,类型对象不是简单的一个字符串。通过调用type()函数,可以获得对象的类型。
>>> type(42)
<type 'int'>
虽然看起来返回结果像一个字符串,但是也是对于人来说的。实际上,返回的结果就是一个type对象。
>>> type(type(42))
<type 'type'>
python中所有对象的类型都是type,它也是所有python类型的根。
3.2 None, Python 的 Null 对象
Python中有一个特殊的类型,被称作Null对象或者NoneType,它只有一个值,就是None。Null是一个类型,它只有None值。
4 内部类型
简要介绍一下内部类型,一般的程序员不会直接和这些对象打交道。
- 代码
- 帧
- 跟踪记录
- 切片
- 省略
- Xrange
4.1 代码对象
代码对象是经过编译的源代码片段,它是可以执行的对象。通过调用内建函数来得到代码对象。
>>> code = 'print "hello world"'
>>> codesample = compile(code, '' ,'exec')
>>> exec codesample
hello world
用type()函数可以看到,返回了一个code类型的对象。
>>> type(codesample)
<type 'code'>
后面在继续深入讨论代码对象,现在先简要介绍一下。
4.2 帧对象
帧对象表示 Python 的执行栈帧。帧对象包含 Python 解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码对象(参见上文),本地及全局名字空间字典以及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个 C 栈帧。用到帧对象的一个地方是跟踪记录对象。
4.3 切片对象
扩展的切片语法允许对不同的索引切片操作,包括步进切片, 多维切片,及省略切片。多维切片语法是 sequence[start1 : end1,start2 : end2], 或使用省略号, sequence[…,start1 : end1 ]. 切片对象也可以由内建函 数 slice() 来生成 。
简单讲一下切片的语法:
>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[0:2]
[0, 1]
a[0:2]的意思,就是选取列表a从第0项到第1项的值,这两个值组成一个新的列表,[0:2]并不是说从第0到第2项三个数,[0:2]是一个左闭右开区间,取不到最右边的值。
>>> b = range(10)
>>> b[ :3]
[0, 1, 2]
冒号一边不写,代表从第0项,或者从最后一项开始,例如b[:3]代表从第0项到第2项的值,而b[3:]代表从第三项到最后一项。
>>> b[3:]
[3, 4, 5, 6, 7, 8, 9]
有时候还会有第三个参数,代表步长,也就是说隔几个数读一次,比如说步长为1,代表挨着读取数组中每个数
>>> b[0:10:1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
可以简单的写为:
>>>b[::1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
步长为2的时候,代表隔一个数读取一次
>>> b[::2]
[0, 2, 4, 6, 8]
步数为3代表隔两个数读取一次
>>> b[::3]
[0, 3, 6, 9]
如果步数为负数,则代表,从后往前数,别的和步数为正的时候一样:
>>> b[::-2]
[9, 7, 5, 3, 1]
4.4 省略对象
省略对象用于扩展切片语法中,起记号作用。 这个对象在切片语法中表示省略号。类似Null 对象 None, 省略对象有一个唯一的名字 Ellipsis, 它的布尔值始终为 True.
4.5 XRange 对象
调用内建函数 xrange() 会生成一个 Xrange 对象,xrange()是内建函数 range()的兄弟版
本, 用于需要节省内存使用或 range()无法完成的超大数据集场合。在第 8 章你可以找到更多
关于 range() 和 xrange() 的使用信息。
5 标准类型运算符
5.1 对象值的比较
用 == 号来判断同类型对象是否相等。这个相等是值相等,也就是说,即使两个对象在内存中的地址不同,只要值相同,就返回true。比如:
>>> 10**3 == 1000
True
5.2 对象身份的比较
python也支持对于对象本身的比较。比如上面的例子,如果进行对象身份比较的话:
>>> 10**3 is 1000
False
有时候,如果我们敲入如下代码:
>>> 4 is 2**2
True
结果却返回了真,这个是因为,python会自动为整数对象和字符串对象创建缓存,不会销毁它们,python会自动缓存(-1,100)之间的整数,这个范围是在不断变化的,我安装的python版本已经到了[-5,265]了。所以造成了假象。
我们可以用浮点数来试一试上面的代码:
>>> 2.0 is 2.0**2
False
如果我们要缓存 2.0**2,可以使用intern()函数:
>>> x = 'a'
>>> 'aa' is x*2
False
>>> 'aa' is intern(x*2)
True
intern()已经不再推荐使用。
5.3 布尔类型
布尔逻辑运算符 and, or, not都是python关键字,这些运算符的顺序从高到低,相当于别的语言的&&,||,!=
6 标准类型内建函数
python提供了一些内建函数对于这些基本内建类型。
cmp(), repr(), str(), type(), 和等同于 repr()函数的单反引号(“) 运算符。
6.1 type ()
type()函数用来接受一个对象,并返回它的类型。它返回值是一个对象。
>>> type(4)
# int type
<type 'int'>
>>>
>>> type('Hello World!')
# string type
<type 'string'>
>>>
>>> type(type(4))
# type type
<type 'type'>
6.2 cmp()
内建函数cmp()用于比较两个对象,可以用于基本类型,也可以用于用户自定义类型。如果是用户自定义的类型,将会调用用户自定义类的特殊方法cmp()。以后将会讨论类的这些特殊方法。
如果左边参数的值比右边小,返回-1,如果左边参数比右边大,返回1,相等返回0.
>>> a, b = -4, 12
>>> cmp(a,b)
-1
>>> cmp(b,a)
1
>>> b = -4
>>> cmp(a,b)
0
7 类型工厂函数
Python从2.2以来,统一了类型和类,所以说现在所有内建类型也都是类。所以以前的类型转换函数,都变成了函数工厂。比如int(), type(), list() 等等。
下面这些大家熟悉的工厂函数在老的 Python 版里被称为内建函数:
- int(), long(), float(), complex()
- str(), unicode(), basestring()
- list(), tuple()
- type()
还有一些全新的数据类型,也增加了相应的函数工厂:
- dict()
- bool()
- set(), frozenset()
- object()
- classmethod()
- staticmethod()
- super()
- property()
- file()
8 标准类型的分类
接下来讨论来python基本类型的几个分类标准
8.1 存储模型
按照某种类型的对象能够保存多少个对象,一个能保存单个字面对象的类型我们称它为原子或标量存储。比如字符串,数值类型。还有能保存多个对象,称为容器型。
标量/原子类型有:数值(所有的数值类型),字符串(全部是文字)
容器类型有:列表、元组、字典
8.2 更新模型
我们还可以按照另外一个标准来对标准类型分类,比如按照对象创建后,它的值是否可以更新来分类。
可以更新的,叫做可变类型,比如列表,字典
不可以更新的,叫做不可变类型,比如数字,字符串,元组
数字是不可变的,比如说,如果a = 1,再把a赋值为2,并不是说1被更新成了2,而是1被回收,新创建了一个数字对象2,把2的引用赋值给a。
8.3 访问模型
现在我们可以按照访问存储数据的方式来对数据类型进行分类。在访问模型中共有三种访问方式:直接存取,顺序存取,和映射。
直接存取,指的是对非容器类型可以直接访问。所有数值类型都归到这一类
顺序存取,指的是可以根据索引顺序来访问数据。
映射存取,指的是可以通过一个唯一的key来存取,它容纳的是哈希键-值对的集合。
- 直接访问 数字
- 顺序访问 字符串、列表、元组
- 映射访问 字典
参考资料:Python核心编程 第二版