[笔记] Python 核心笔记 第四章
一切都是对象,Python使用对象模型来存储数据。包括变量,函数,类,模块等等
所有的python对象都有三个特性:身份,类型和值
身份:每个对象都有一个唯一的身份标识自己,可以通过内建函数 id() 获取
类型:对象的类型决定该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则。可以用内建函数type()查看对象类型,同时内建函数type()返回的也是一个对象
值:对象表示的数据项
上面三个特性在对象创建时就被赋值了。
标准类型
- Integer 整型
- Boolean 布尔型
- Long integer 长整型
- Floating point real number 浮点型
- Complex number 复数型
- String 字符串
- List 列表
- Tuple 元组
- Dictionary 字典
其他内建类型
- 类型
- Null对象(None)
- 文件
- 集合/固定集合
- 函数/方法
- 模块
- 类
所有类型对象的类型都是type,它是所有Python类型的根和所有Python标准类的默认元类(metaclass)
None的布尔值总是False
所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布尔True或者False值。空对象,值为零的任何数字或者Null对象None 的布尔值都是False。
下列对象的布尔值是False
- None;
- False(布尔类型);
- 所有的值为零的数;
- 0(整型);
- 0.0 (浮点型);
- 0L (长整型);
- 0.0+0.0j (复数);
- "" (字符串);
- [] (空字符串);
- () (空元组);
- {} (空字典);
值不是上面列出来的任何值的对象的布尔值都是True,例如non-empty,non-zero等。
用户创建的类实例如果定义了nonzero(__nonzero__())或者length(__len__())且值为0,那么他们的布尔值就是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,不过它不是内建的需要导入。