Python学习笔记(四)Python对象

1,Pythons对象特点

从更具体的视角看,Python程序可分解成模块、语句、表达式和对象。程序由模块组成,模块包含语句,语句包含表达式而表达式建立并处理对象。Python提供了强大的对象类型作为语言的组成部分,除非有内置类型无法处理得特殊对象,用户最好总是使用内置对象。Python内置对象类型强大而高效,是一个python程序的核心部分,让编程变得简单。使用内置对象的优点是:

(1)使编程更容易-内置对象往往可以表现问题领域的所有结果,还可以马上使用集合、搜索表等强大的工具,仅使用内置对象类就可以完成许多工作。

(2)内置对象是扩展的组件-对于复杂的任务,用户需提供自己的对象,使用python类或者C语言的接口。但人工实现的对象往往建立在字典和列表这样内置类型的基础上。

(3)内置对象更有效率-Python的内置类型优化了用C实现数据结构的算法,因此性能优于自己构造的数据结构。

(4)内置对象是Python语言标准一部分-Python内置工具是标准、一致的,独创的框架则依赖于实现的环境。

下图是Python提供的核心内置对象类型,另外Python程序处理的每一样东西都是一种对象。Python的类型是动态类型的且是强类型,Python对象没有类型声明,运行的表达式就绝了了python建立和使用的对象类型,对象一旦创建,它就和响应的操作类型绑定了-如对字符只能进行字符串操作。

底层语言中,当对象不在需要时必须小心的释放其占用的对象空间。Python则比较简单,最后一次引用某对象后,该对象占用的内存会被自动清理掉(如通过rev=0,则对象rev之前占用的内存空间即自动释放了)。如此的垃圾回收机制使得用户可以自由的使用对象,而不用为创建或者清理对象空间而担心。

Python学习笔记(四)Python对象_第1张图片

所有的python对象支持比较操作-测试相等性、比较大小等,其比较总是遍历对象的所有部分,知道可以得出结果。过程中首次发现的差值将决定比较结果。

相同的对象类型之间才可以进行“大于、小于等”比较操作,比较特殊的是“==”和“is”,支持不同类型对象间的比较。操作符“==”测试对象内容(包含的元素)是否相同(不一定是同一个对象),操作符“is”则测试两者是否是同一个对象(位于相同的地址空间),如判断两个引用是否指向同一个对象。

2,Python对象通常意义下的分类

Python所有的一切都是某种类型的对象,即便是某个对象的类型,“任何对象的类型”都是类型为“type”的对象。下图总结了Python允许的所有内置对象类型和他们之间的关系。调用内置函数type(x)能够返回对象“x”的类型。

Python学习笔记(四)Python对象_第2张图片

除了Python的核心对象,典型的Python安装还包括其他可用的对象类型,允许作为C语言的扩展程序或是Python的类,如:正则表达式对象、DBM文件、网络套接字soket等。他们与python内置类型的区别在于-必需先导入才能使用。

通常意义上,Python核心数据类型分三大类,各自都有某些特定的操作。他们是:数字、序列和映射(支持基于键的索引,如字典),本节着重描述了python序列。

在Python中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序号—即元素的位置,也称为索引。第一个索引是 0、第二个则是 1、以此类推。序列中的最后一个元素标记为 -1、倒数第二个元素为 -2、以此类推。所有序列类型都可以进行某些特定的操作。这些操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员(成员资格)。除此之外,Python还有计算序列长度、找出最大元素和最小元素的内建函数。Python包含 6 中内建的序列,包括列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。

从是否原处可修改,Python对象又分为可变对象和不可变对象。可变对象支持原处修改,包括列表和字典;不可变对象不支持原处需改,包括数字、字符串、元组。

3,Python核心内置对象类型

i) 数字-Python数字对象包括常规的类型:整数、浮点数以及无限精度长整数(根据需要,自动将整型变成长整型s)、复数、集合等,数字支持一般的运算如加减、乘除、幂。浮点数的打印分全精度(小数点后数位多)和用户友好型(通过print打印时、小数位少)。Python提供的数字操作类型则包含math类、random类等。

另外,Python还支持小数对象,通过一个导入的模块调用函数创建。尽管相对于浮点数有精度的些许损失,小数类型是对表现固定精度的特性和实现确定的数字精度是理想的工具。0.1+0.1+0.1-0.3的结果本应是0,但结果却是5.551115123125783e-17。借助于小数对象:

from decimal import Decimal
Decimal(‘0.1’)+Decimal(‘0.1’)+ Decimal(‘0.1’)-Decimal(‘0.3’)=Decimal(‘0.0’)

decimal模块中还可以设定小数位的精度。

ii)字符串-记录文本信息,严格来说是一个个字符的序列。Python字符串具有不可变性-即创建后即不能再改变其值。例如字符串改变后用户不能改变字符串任何位置的值,但是可以通过使用同一变量名创建新对象来重新赋值,如S=‘A’+S[1:4]将创建一个新的字符串S字符串操作则包含求长、索引、分片(string[i:j],string中从i到j位)、合并(字符串+)、重复(字符串*,如string*8表示string重复8次)、查找、替换(是创建了一个新的字符串对象,原字符串值不变)等。用户可通过dir(S)(S是一个字符串对象)查看字符串的操作方法,其中没有下划线的属性即是。

python中没有单个字符这种类型,但是可以使用只有一个字符的字符串。Python字符串既可以用一对单引号表示,也可以用一对双引号表示,可以在一个双引号表示字符串中嵌入一个单引号字符,反之亦可(双引号字符串中嵌入双引号必须采用转义字符\,单引号字符串也是如此)。如果想要保留‘\’,有两种方法:a, 如果字母r(大写或者小写)出现在字符串第一个引号前面,它就会关闭转义机制;b, 使用双反斜线“\\”

三重引号(单、双引号均可)可用来编写多行文本数据,这种形式只需以三重引号开始、三重引号结束即可,python会在换行出插入换行符”\n“。三重引号机制可用来暂时废除一段python程序,在该段程序前后各嵌入"""即可。

字符串中”%“操作符为编写多字符串替换提供了简洁的方法。如‘Your name is %s, your class is %d’ %(‘Aidan’,1),%d表示插入数字十进制整数,%s表示插入字符串(任何对象都可以转换成字符串插入)。”%“操作符的具体结构和代码含义如下图。

Python学习笔记(四)Python对象_第3张图片

iii)列表-列表是Python提供的最通用的序列,列表是任意类型的对象位置相关的有序集合,没有有固定大小,可任意扩减。

列表是python中最具灵活性的有序集合对象类型,可以包含任何类型的对象:数字、字符串、其他列表。列表是可变序列对象、可在原处修改、可通过偏移读取。从技术上来说,列表包含了零或多个对其他对象的引用,标准python解释器内部,列表就是C数组。

列表支持所有的序列操作,并有列表特定类型的操作如append、delete、pop、insert等,用户可通过dir(L)(L是一个列表对象)查看列表的操作方法,其中没有下划线的属性即是。尽管列表没有固定的大小,但仍不允许引用不存在的元素(若有需要,列表中可采用None对象做占位用),若要增大列表则可通过调用append方法。列表支持任意组合的嵌套,如构造二维数组列表解析则可在矩阵中轻松获取某列(矩阵按行存储)。

M=[[1,2,3],
      [4,5,6],
       [7, 8, 9]]
则col2 = [raw[1] for raw in M]可得col2=[2,5,8]
diag=[M[i][i] for i in [0,1,2]]得到对角元素diag=[1,5,9]

v) 字典-Python字典是一种映射,通过键来存取,简单的将键映射到值。字典也具有可变性,可动态的扩减,字典编写在大括号内,包含了一些列的“键:值”对,”键“s可以是数字和字符串,甚至元组。字典是任意对象的无序集合、支持嵌套,属于可修改映射类型(原处可修改),从本质上是基于哈希表实现的,存储的是对象的引用。

字典中引用一个不存在的键会引起错误,为了防止引用不存在的键,一个技巧就是首先通过in(3.0后取消了has_key()方法)进行测试,并结合if语句分支处理。下面的例子以Python3.1为例

D={‘a’:1,'b':2,'c':3}
if 'd' in D:
     print(D['d'])
else:
     D['d'] = 4

vi)元组-元组提供了完整性约束,是任意对象的有序集合,可通过偏移索引,属于不可变序列类型(原处不可更改),固定长度,支持嵌套。元组最好被认为是对象引用的数组,用括号括起来、逗号隔开,元组支持序列的所有操作。相对于列表,元祖的不可更改性提供了某种完整性保护,确保其在程序运行过程中不会被另一个引用修改。元组还可以做为字典的键。

vii)文件-文件对象是Python程序对电脑上外部文件的主要接口,调用内置的函数open即创建了一个文件对象。文件操作有write、read、close等。Python程序中的文本文件采用字符串的形式,从文本中独到的数据是字符串,用户可根据需要转换成其他类型的对象(需要借助转换工具,如eval可将字符串转成对象),写入文件时用户也必须传第一个已经格式化了的字符串。另外,pickle模块是通用的数据格式化和解析工具,能让用户直接再文件中存储各种类型的Python对象,无需把字符串转来转去。struct模块则可以构造或者解析打包的二进制数据文件

调用文件close方法会终结程序多外部文件的调用,手动调用close是一个不错的编程习惯。

viii)其他的Python内置对象类型还包括集合(区别于序列之处在于集合不包含位置顺序)、布尔值(其值为TRU或者FALSE)等,也支持用户自定义类。

4,Python内置类型注意事项

1)赋值生成的是引用

Python 中任何赋值本质上都是对对象的一次引用,在可变对象的共享引用中(如嵌套)必须注意这一点。为了避免共享应用导致的修改问题,用户可以通过明确的拷贝(需要deepcop,deepcopy会完整的将每一个元素复制、产生新的对象;[:]是浅copy,对于列表、字典中的嵌套,浅copy还是只copy了引用)来生成一个新的、无共享的对象。

L=[1,2,3]
M=['X',L,'Y'] #运行结果为:M=['X',[1,2,3],'Y'],L是一个引用
L[1]=0
M #M也将随着改变,变为M=['X',[1,0,3],'Y']

2)不可变类型不可在原处修改

Python中不可变类型不可能在原地修改,如果需要,用户可采用分片、合并等操作创建一个新的对象,然后赋值给原变量(一次新的引用)。

3)注意循环对象

若一个对象包含指向自身的引用就称为循环对象,python检测到循环对象会打印成[...]。循环对象可能导致程序陷入无法预期的循环,需慎用。

4)序列重复

序列的重复、合并和分片只存在于序列的顶层(即不深入嵌套结构),因此若L是列表,L*4(顶层元素是L的每个元素)和[L]*4是(顶层元素是列表[],元素嵌套了列表L的一个引用)不同的。


你可能感兴趣的:(编程语言)