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就够用了。

posted @ 2012-03-10 19:58  止於至善  阅读(1385)  评论(0编辑  收藏  举报