[笔记] Python 核心笔记 第四章

2018-03-05  本文已影响8人  四明羽客

一切都是对象,Python使用对象模型来存储数据。包括变量,函数,类,模块等等

所有的python对象都有三个特性:身份,类型和值
身份:每个对象都有一个唯一的身份标识自己,可以通过内建函数 id() 获取
类型:对象的类型决定该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则。可以用内建函数type()查看对象类型,同时内建函数type()返回的也是一个对象
值:对象表示的数据项
上面三个特性在对象创建时就被赋值了。

标准类型

其他内建类型

所有类型对象的类型都是type,它是所有Python类型的根和所有Python标准类的默认元类(metaclass)

None的布尔值总是False

所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布尔True或者False值。空对象,值为零的任何数字或者Null对象None 的布尔值都是False。
下列对象的布尔值是False

操作符 功能
expr1 > expr2 expr1 大于 expr2
expr1 < expr2 expr1 小于 expr2
expr1 <= expr2 expr1 小于等于expr2
expr1 >= expr2 expr1 大于等于expr2
expr1 == expr2 expr1 等于 expr2
expr1 != expr2 expr1 不等于 expr2 (C语言风格)
expr1 <> expr2 expr1 不等于 expr2 (ABC/Pascal风格)

标准类型操作符
对象值比较操作符

操作符 功能
expr1 > expr2 expr1 大于 expr2
expr1 < expr2 expr1 小于 expr2
expr1 <= expr2 expr1 小于等于expr2
expr1 >= expr2 expr1 大于等于expr2
expr1 == expr2 expr1 等于 expr2
expr1 != expr2 expr1 不等于 expr2 (C语言风格)
expr1 <> expr2 expr1 不等于 expr2 (ABC/Pascal风格)

未来可能不再支持<>,所以推荐用 !=
python支持多个比较符在同一行上,求值顺序从左到右
>>> 3 < 4 < 7 # 等于 (3 < 4) and (4 < 7)
True
>>> 4 > 3 == 3 # 等于 (4 > 3) and (3 == 3)
True
>>> 4 < 3 < 5 != 2 < 7 # 等于 (4 < 3) and (3 < 5) and (5 != 2) and (2 < 7)
False

操作符 功能
obj1 is obj2 obj1 和 obj2是同一个对象
obj1 is not obj2 obj1 和 obj2不是同一个对象

对象身份比较操作符

操作符 功能
obj1 is obj2 obj1 和 obj2是同一个对象
obj1 is not obj2 obj1 和 obj2不是同一个对象

obj1 is obj2 等价于 id(obj1) == id(obj2)

整型和字符串对象都是不可变对象,所以Python会很高效的缓存它们。这会造成我们认为Python应该创建新对象的时候,它却没有创建新对象的假象。请看下面的例子。
>>> a = 1
>>> id(a)

8402824
\>>> b = 1
\>>> id(b)
8402824
\>>>
\>>> c = 1.0
\>>> id(c)
8651220
\>>> d = 1.0
\>>> id(d)
8651204

Python仅缓存简单整型,因为它认为在Python应用程序中这些小整型会经常被用到,整型的缓存范围随着Python版本的不同而有所改变

操作符 功能
not expr expr的逻辑非(否)
expr1 and expr2 expr1 和 expr2的逻辑与
expr1 or expr2 expr1 和 expr2的逻辑或

逻辑操作符

操作符 功能
not expr expr的逻辑非(否)
expr1 and expr2 expr1 和 expr2的逻辑与
expr1 or expr2 expr1 和 expr2的逻辑或

另外not的优先级比and和or高,而and的优先级比or高,not > and > or
特别注意or和and的短路逻辑,x or y and z,因为优先级的关系,表达式等于 x or (y and z),如果x为True,那么因为短路逻辑后面的y和z两个表达式都不会判断;and也是同样,x and y,如果x为False,整个表达式直接返回False,y不会再去判断
>>> 0 or 5 or 1 or 8
5
>>> 'world' and 'hello' or False
'hello'
>>> a = 1 and 4 or 0
>>> a
4

函数 功能
cmp(obj1, obj2) 比较obj1和obj2,根据比较结果返回整型i:i < 0 if obj1 < obj2; i >0 if obj1 > obj2; i ==0 if obj1 ==obj2
repr(obj) 或者 `obj` 返回一个对象的字符串表示
str(obj) 返回对象合适可读性好的字符串表示
type(obj) 得到一个对象的类型,并返回相应的type对象

标准类型内建函数

函数 功能
cmp(obj1, obj2) 比较obj1和obj2,根据比较结果返回整型i:i < 0 if obj1 < obj2; i >0 if obj1 > obj2; i ==0 if obj1 ==obj2
repr(obj) 或者 `obj` 返回一个对象的字符串表示
str(obj) 返回对象合适可读性好的字符串表示
type(obj) 得到一个对象的类型,并返回相应的type对象

str()函数得到的字符串可读性好,而repr()函数得到的字符串是一个对象的“官方”字符串表示,通常可以通过它重新获得该对象,通常情况下 obj == eval(repr(obj)) 这个等式是成立的,但注意并非一定可以通过eval()函数得到原来的对象

注意:Python不支持方法或者函数的重载

P70 页有给出Python类型操作符和内建函数的总结表格

标准类型按照存储模型,更新模型,访问模型这3种模型进行分类

分类 Python类型
标量/原子类型 数值(所有的数值类型),字符串
容器类型 列表,元组, 字典

根据存储模型分类

分类 Python类型
标量/原子类型 数值(所有的数值类型),字符串
容器类型 列表,元组, 字典

一个能保存单个字面对象的类型,称为原子或者标量存储
可以容纳多个对象的类型,称为容器类型;所有Python容器对象都能够容纳不同类型的对象

分类 Python 类型
可变类型 列表, 字典
不可变类型 数字,字符串,元组

根据更新模型分类

分类 Python 类型
可变类型 列表, 字典
不可变类型 数字,字符串,元组
分类 Python类型
直接访问 数字
顺序访问 字符串,列表,元组
映射访问 字典

根据访问模型分类

分类 Python类型
直接访问 数字
顺序访问 字符串,列表,元组
映射访问 字典
数据类型 存储模型 更新模型 访问模型
数字 标量 不可变 直接访问
字符串 标量 不可变 顺序访问
列表 容器 可变 顺序访问
元组 容器 不可变 顺序访问
字典 容器 可变 映射访问

标准类型分类

数据类型 存储模型 更新模型 访问模型
数字 标量 不可变 直接访问
字符串 标量 不可变 顺序访问
列表 容器 可变 顺序访问
元组 容器 不可变 顺序访问
字典 容器 可变 映射访问

Python 不支持 char类型,指针;整型和长整型也做了融合基本不用管;不像C语言有单精度和双精度两种浮点数类型,Python只有一种浮点数类型,实际上就是C语言的双精度。
对于需要更高精度的用户,Python提供了一种十进制浮点型类型Decimal,不过它不是内建的需要导入。

上一篇下一篇

猜你喜欢

热点阅读