Python学习笔记 03 Python对象
1、Python对象
Python对象都拥有三个特性:身份、类型和值。
身份:每一个对象都有一个唯一的身份标识自己,任何对象的身份都可以使用内建函数id()来得到。这个值可以被认为是该对象的内存地址。
类型:对象的类型决定了该对象可以保存什么类型的值,可以进行什么样操作,以及遵循什么样的规则。可以使用内建函数type()查看Python对象的类型。
值:对象表示的数据项。
常用的对象属性是函数和方法,有一些Python类型也有数据属性。含有数据属性的对象包括:类、类实例、模块、复数和文件。
2、标准类型
数字 整型 布尔型 长整型 浮点型 复数型 字符串 列表 元组 字典
3、其他内建类型
(1)类型对象和type类型对象
Python类型本身也是对象。内建函数type()。
>>> type(42)
<type 'int'>
>>> type(type(42))
<type 'type'>
所有的类型对象都是type,它也是所有Python类型的根和所有Python标准类的默认元类(metaclass)。
(2)None—Python中的Null对象
Python有一个特殊的类型,称为Null对象或NoneType,它只有一个值就是None。
它不支持任何运算,没有任何内建的方法。None和C语言中的void类型最接近,值接近于C语言中的Null。None没有什么有用属性,它的布尔值为False。
核心笔记:布尔值
所有的标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布尔True或False值。空对象或值为零的任何数字或Null对象None的布尔值都是False。
下列对象的布尔值为False。
None
False(布尔类型)
所有值为零的数
0(整型)
0.0(浮点型)
0L(长整型)
0.0+0.0j(复数)
“”空字符串
[]空列表
()空元组
{}空字典
非以上任何值的对象的布尔值都是True。
4、内部类型
(1)代码对象
代码对象指编译过的python源代码片段,它是可执行对象。通过调用内建函数complie()可以得到代码对象,代码对象可以被exec命令或eval()内建函数来执行。
(2)帧对象
帧对象表示Python的执行栈帧。帧对象包含python解释器在运行时候所需要信息,它的属性包括指向向一个帧的链接,正在执行的代码对象,本地以及全局名字字典以及当前指令;每次函数调用都产生一个帧对象。
(3)跟踪记录对象
异常发生时候,一个包含对异常的栈跟踪记录的对象被创建。
(4)切片对象
当Python使用切片语法时候就会产生切片对象。扩展的切片语法允许对不同的索引切片操作包括步进切片、多维切片和省略切片。多维切片的语法是sequence[start1:end1,start2:end2],或使用省略号,sequence[…,start1:end1]。切片对象也可以由内建函数slice()。步进切片允许利用第3个切片元素进行切片,它的语法为sequence[起始索引:结束索引:步进值]。
>>> fooster = 'abcde'
>>> foostr[::-1]
'edcba'
>>> foostr[::-2]
'eca'
>>> foolist = [123, 'xba', 342.2, 'abc']
>>> foolist[::-1]
['abc', 342.2, 'xba', 123]
(5)省略对象
省略对象用于扩展的切片语法中,起记号作用。省略对象有一个唯一的名字Ellipsis,它的布尔值始终为True。
(6)XRange对象
内建的xrange()函数会产生一个xrange对象,xrange()是内建函数range()的兄弟版本,它可以节省内存或产生range无法完成的超大数据集合。
5、标准类型操作符
(1)对象值的比较
比较运算符判断同类型的对象是否相等,所有内建类型都支持比较运算,比较运算返回布尔值。 多个比较运算符可以再同一行进行,求值的顺序为从左到右。
>>> 2 == 2
True
>>> 2.46 <= 8.33
True
>>> 'abc' == 'xyz'
False
>>> 'abc' < 'xyz'
True
>>> [3, 'abc'] == ['abc', 3]
False
>>> [3, 'abc'] == [3, 'abc']
True
>>> 3 < 4 <7
True
>>> 4 > 3 == 3
True
(2)对象身份的比较
变量可以看作对象的链接。foo1 = foo2 = 4.3,foo1和foo2指向相同的对象。
若foo2 = fool或foo2=3+1.3,则它们不指向同一对象。
Python提供了is和is not操作符来测试两个变量是否指向同一个对象。
a is b等价于id(a) == id(b)。
核心提示:
整数对象和字符串对象是不可变对象,python会高效的缓存他们。这会造成我们认为python应该创建新对象的时,它却没有。
>>> a = 1
>>> id(a)
19523112
>>> b = 1
>>> id(b)
19523112
>>>
>>> c = 1.0
>>> id(c)
33637528
>>> d = 1.0
>>> id(d)
19555384
但是不要在应用程序中应用这Python缓存的特性。
(3)布尔类型
按优先级排列:not,and,or,分别表示逻辑非,逻辑与,逻辑或。
6、标准类型内建函数
(1)type()
type()是工厂函数。type(object)返回对象的类型。
>>> type(4)
<type 'int'>
>>> type('Hello World')
<type 'str'>
(2)cmp()
内建函数cmp()用于比较两个对象obj1和obj2。cmp(obj1, obj2),结果返回一个整型。
如果obj1 < obj2,则返回一个负整型,如果obj1 > obj2,则返回一个正整型,
如果obj1 < obj2,则返回一个0。如果是用户自定义对象,cmp()会调用该类的特殊方法_cmp_()。
>>> a, b = 4, 12
>>> cmp(a, b)
-1
(3)str()和repr()以及``操作符
内建函数str()和repr()或反引号操作符(``)可以以字符串的方式获取对象的内容、类型、数值属性等信息。str(ob)返回对象适合可读性好的字符串表示。repr(obj)或`obj`返回一个对象的字符串表示,可以重新获得该对象,通常obj == eval(repr(obj))。
(4)type()和isinstance()
1 #!/usr/bin/env python
2
3 def displayNumType(num):
4 print num, 'is',
5 if isinstance(num, (int, long, float, complex)):
6 print 'a number of type:', type(num).__name__
7 else:
8 print 'not a number at all!!'
9
10 displayNumType(-69)
11 displayNumType(9999999999999999999999L)
12 displayNumType(98.6)
13 displayNumType(-5.2+1.9j)
14 displayNumType('xxx')
输出:
-69 is a number of type: int
9999999999999999999999 is a number of type: long
98.6 is a number of type: float
(-5.2+1.9j) is a number of type: complex
xxx is not a number at all!!
>>> help(isinstance)
Help on built-in function isinstance in module __builtin__:
isinstance(...)
isinstance(object, class-or-type-or-tuple) -> bool
Return whether an object is an instance of a class or of a subclass thereof.
With a type as second argument, return whether that is the object's type.
The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for
isinstance(x, A) or isinstance(x, B) or ... (etc.).
由此可见,isinstance()函数可以减少函数调用的次数,减少查询次数。
7、类型工厂函数
原来的内建转换,像int()、type()、list()等,现在都成了工厂函数。貌似函数的类。调用的时候,实际上是生成了该类型的一个实例。
int() long(),float(),complex()
str() unicode(),basestring()
list() ,tuple()
type()
dict()
bool()
set()
frozenset()
object()
classmethod()
staticmethod()
super()
property()
file()
8、标准类型的分类
“基本”这些类型是python提供的标准或核心类型;
“内建”是由于这些类型是python默认提供的;
“数据”因为他们一般用于数据存储;
“对象”因为对象是数据和功能的默认抽象;
“原始”因为这些类型提供的是最底层的粒度数据存储;
“类型”因为他们就是数据类型。
(1)存储模型
标量/原子类型 数值、字符串
容器类型 列表、元组、字典
(2)更新模型
以可否改变作为分类标准。
可变类型 列表、字典
不可变类型 数字、字符串、元组
>>> x = 'Python'
>>> id(x)
19829920
>>> x = 'c++'
>>> id(x)
33462008
(3)访问模型(首要区分)
直接访问 数字
顺序访问 字符串、列表、元组
映射访问 字典
数据类型 |
存储模型 |
更新模型 |
访问模型 |
数字 |
标量 |
不可更改 |
直接访问 |
字符串 |
标量 |
不可更改 |
顺序访问 |
列表 |
容器 |
可更改 |
顺序访问 |
元组 |
容器 |
不可更改 |
顺序访问 |
字典 |
容器 |
可更改 |
映射访问 |
9、不支持的类型
char或byte
可以用字符串表示字符或8比特整数
没有指针,在Python中,一切都是指针。
如果需要高精度的数字,可以采用Decimal类,必须导入decimal模块。
在处理金钱这类确定的值时,Decimal类型很有用。在其他场合,一般float就够用了。