一.对象
Python 对象 : Python使用对象模型来存储数据.构造任何类型的值都是一个对象,. 尽管Python通常当成一种 "面向对象的编程语言" ,但是你完全能够写出不使用任何类和实例的实用脚本.
所有的Python对象都拥有三个特征 : 身份,类型和值 .
身份 : 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建
函数id() 来得到. 这个值被认为是改对象的内存地址.类型 : 对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,
一级遵循什么样的规则.可以通过函数type()查看Python对象的类型.
3.值 : 对象表示的数据项 .
上面三个特性在对象创建的时候就被赋值,除了值之外,其他两个特性都是只读的.对
于新风格的类型和类,对象的类型也是可以改变的,不过对于初学者并不推荐这样做.
对象属性 : 某些Python对象有属性,值,或相关联的可执行代码,比如方法(method) . Python用点(.) 标记法开访问属性. 属性包括相应对象的名字等等 . 最常用的属性是函数和方法 ,不过有一些Python类型也有数据属性. 含有数据属性的对象包括(但不限于) : 类,类实例,模块和复数 .
二. 标准类型(基本数据类型) :
整数
浮点数
布尔值
复数
字符串
列表
元组
字典
三.其他内建类型 :
类型
Null对象(None)
文件
集合/固定集合
函数/方法
模块
类
类型对象和type类型对象 : 虽然看上去把类型本身也当成对象有点特别,我们还是要在这里提一提. 你一定还记得,对象的一系列固有行为和特征(比如支持哪些运算,具有哪些方法) 必须事先定义好. 从这个角度看,类型正是保存这些信息的最佳位置. 描述一种类型所需要的信息不可能用一个字符串来搞定, 所以类型不能是一个简单的字符串,这些信息不能也不应该和数据保存在一起,所以我们将类型定义成对象.
所有类型对象的类型都是type ,它也是所有Python类型的根和所有Python标准类的默认元类(metaclass) . 类就是类型,实例是对应类型的对象.
None,Python的Null 对象 : Python有一个特殊的类型,被称作Null对象或者NoneType ,它只有一个值,那就是None.它不支持任何运算也没有任何内建方法. None没有什么有用的属性,它的布尔值总是False.
核心笔记 : 布尔值 . 所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小 . 每个对象天生具有布尔True 或 False .空对象,值为零的任何数字或者Null对象None的布尔值都是False .下列对象的布尔值是False :
None
False
所有值为零的数
0 (整型)
0.0(浮点型)
0.0+0.0j(复数)
'' (空字符串)
[] (空列表)
() (空元组)
{} (空字典)
值不是上面列出来的任何值的对象的而不知都是True , 例如non-empty ,non-zero 等
等 . 用户创建的类实例如果定义了nonzero(_nonzero)()) 或length(len()) 且
值为 0 ,那么他们的布尔值就是False .
四. 内部类型
● 代码
● 帧
● 跟踪记录
● 切片
● 省略
● Xrange
代码对象 :
帧对象 :
跟踪记录对象 : 当你的代码出错时 , Python就会引发一个异常 . 如果异常未被捕获和处理,解释器就会退出脚本运行 ,处理程序就可以访问这个跟踪记录对象 .
切片对象 : 当使用Python扩展的切片语法时,就会创建切片对象. 扩展的切片语法允许对不同的索引切片操作,包括步进切片,多维切片,及省略切片 . 切片对象也可以由内建函数 slice() 来生成 . 步进切片允许利用第三个切片元素进行步进切片.
省略对象 :
XRange 对象 : 调用内建函数xrange() 会生成一个Xrange对象,xrange() 是内建函数range() 的兄弟版,用于需要节省内存使用或range() 无法完成的超大数据集场合 .
五. 标准类型运算符
比较运算符用来判断同类型对象是否相等,所有内建类型均支持比较运算,比较运算返回布尔值True 或 False .
不同于很多其他语言,多个比较操作可以在同一行上进行, 求值顺序从左到右 .
我们会注意到,比较操作是针对对象的值进行的,也就是说比较的是对象的数值而不是对象本身.
对象身份比较 : 作为对值比较的补充,Python也支持对象本身的比较. 对象可以被赋值到另一个变量(通过引用) . 因为每个变量都指向同一个(共享的) 数据对象, 只要任何一个引用发生改变, 该对象的其他引用也会随之改变 .
is is not : Python提供了is 和is not 运算符来测试两个变量是否指向同一个对象(对象身份).
核心提示 : 小整数池 .
布尔类型 : not 运算符拥有最高优先级, 只比所有运算低一级. and 和 or 运算符则相应的再低一点.
前面提到过Python支持一个表达式进行多种比较操作 ,其实这个表达式本质上是由多个隐式的and 链接起来的多个表达式.
六.标准类型内建函数
type() : 接收一个对象作为参数,并返回它的类型, 它的返回值是一个类型对象 . 对type()的返回值再次调用type() ,注意type() 有趣的输出 .
核心笔记 : 在Python学习过程中, 偶尔会遇到某个运算符和某个函数是做同样一件事情 ,之所以如此是因为某些场合函数会比运算符更适合使用. 函数比表达式用起来方便 .
type() 和isinstance() : Python不支持方法或函数重载,因此你必须自己保证调用的就是你想要的函数或对象 . type() 函数可以做到这一点 . isinstance 来判断某个对象是否是某个类的实例. 返回True 或 False .
减少函数调用的次数 : 如果我们减少函数的调用次数, 就会提高程序的性能 .
七. 类型工厂函数
Python2.2.同意了类型和类,所有的内建类型现在也都是类 . 在这些基础上,原来的所谓内建转换函数像int() , type() ,list() 等等,现在都成了工厂函数 . 也就是说虽然他们看上去有点像函数,实质上他们是类.当你调用他们时,实际上是生成了该类型的一个实例 .
八.标准类型的分类
如果让我们最啰嗦的描述标准类型, 我们也许会称他们是Python的基本内建数据对象原始类型 .
"基本" : 是指这些类型都是Python提供的标准或核心类型
"内建" : 是由于这些类型是Python默认就提供的
"数据" :因为他们用于一般数据存储
"对象" : 因为对象是数据和功能的默认抽象
"原始" : 因为这些类型提供的是最底层的粒度数据存储
"类型" 因为他们就是数据类型
存储模型 : 我们队类型进行分类的第一种方式 ,就是看看这种类型的对象能保存多少个对象. Python的类型,就像绝大多数其他语言一样,能容纳一个或多个值.一个能保存单个字面对象的类型我们称它为院子或标量存储.那些可容纳多个对象的类型,我们称之为容器存储.(容器对象有时会在文档中被称为复合对象,不过这些对象并不仅仅指类型,还包括类似实例这样的对象)容器类型又带来一个新问题,那就是它是否可以容纳不同类型的对象. 所有的Python容器对象都能够容纳不同类型的对象.字符串看上去看一个容器类型,因为它"包含"字符(并且经常多余一个字符),不过由于Python并没有字符类型,所以字符串是一个自我包含的文字类型.
标量 / 原子类型 : 数值,字符串
容器类型 : 列表,元组,字典
更新模型 : 另一种对标准类型进行分类的方式就是,针对每一个类型问一个问题:'对象创建成功之后,它的值可以进行更新么 ? 某些类型允许他们的值进行更新,而另一些则不允许 . 可变对象允许他们的值被更新,而不可变对象则不允许他们的值被更改 .
为什么i = 0 ,i = i + 1 , i为什么等于1 . 不是说数值和字符串对象是不可改变的么 ? 事实上,这里是一个新对象被创建,然后它取代了旧对象. 通过id()函数就可以很清楚的看到对象实际上已经被替换了.
访问类型 :尽管前面两种模型分类方式在介绍Python时都很有用,他们还不是区分数据类型的首要模型. 对这种目的,我们使用访问模型.也就是说根据访问外面存储的数据的方式对数据类型进行分类.在访问模型中共有三种访问方式 : 直接存取,顺序,和映射 .
对非容器类型可以直接访问,.所有数值类都归到这一类
序列类型是指容器内的元素按从0 开始的索引顺序访问. 一次可以访问一个元素或多个元素,也就是大家所了解的切片. 字符串,列表和元组都归到这一类.前面说过,Python不支持字符类型,因此,虽然字符串是简单的文字类型,因为它有能力按照顺序访问子字符串,所以也将它归到序列类型.
映射类型类似序列的缩影属性忙不过来它的缩影并不使用顺序的数字偏移量取值,它的元素无序存放,通过一个唯一的key来访问,这就是映射类型,它容纳的是哈希键值对的集合.
为什么要对同样的数据类型再三分类呢 ? 首先,我们为什么要分类 ? 因为Python提供了高级的数据结构,我们需要将那些原始的类型和功能强大的扩展类型区分开来. 另一个原因就是这有助于搞清楚某种类型应该具有什么行为.
直接访问 : 数字
顺序访问 : 字符串,列表,元组
映射访问 : 字典
数据类型 存储类型 更新模型 访问类型
数字 Scalar 不可更改 直接访问
字符串 Scalar 不可更改 顺序访问
列表 Container 可更改 顺序访问
元组 Container 不可更改 顺序访问
字典 Container 可更改 映射访问
7.为什么要用这么多不同的模型或从不同的方面来分类 ? 所有这些数据类型看上去是很难分类的.他们彼此都有着错综复杂的关系,所有类型的共同之处最好能揭示出来,而且我们还想揭示每种类型的督导之处.没有两种类型横跨所有的分类. (当然,所有 的数值子类型能刀座了这一点,所以我们将它们归纳到一类当中) .最后我们确信搞清楚所有类型之间的关系会对你的开发工作有极大的帮助.你对每种类型了解越多,你就越能在自己的程序中使用恰当的类型以达到最佳的性能.
8.不支持的类型
char或byte : Python没有这两种类型来保存单一字符或8比特整数.你可以使用长度为1的字符串表示字符或8比特整数
指针: Python替你管理内存,因此没有必要访问指针. 你可以用id()得到一个对象的身份号, 这是最接近指针的地址.因为你不能控制这个值,所以其实没有太大意义.在Python中,一切都是指针 .