笔记
字符串与编码
- 含有中文的 str 无法用 ASCII 编码,因为中文编码的范围超过了 ASCII 编码的范围,Python 会报错
- ord() 函数获取字符的整数表示,chr() 函数把编码转换为对应的字符
- bytes 类型的数据用带 b 前缀的单引号或双引号表示,例: x = b’ABC’
- 在 bytes 中,无法显示为ASCII字符的字节,用 \x## 显示。
- 以 Unicode 表示的 str 通过 encode() 方法可以编码为指定的 bytes;把 bytes 变为str,用 decode() 方法
- 如果 bytes 中只有一小部分无效的字节,可以传入 errors=‘ignore’ 忽略错误的字节:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'
- len() 函数计算的是 str 的字符数,如果换成 bytes,len() 函数就计算字节数:
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6
1个中文字符经过 UTF-8 编码后通常会占用3个字节,而1个英文字符只占用1个字节
list 与 tuple
- List 集合用 [ ] 表示,tuple 用( )表示
- 若用负数作为索引,则以倒序开始获取集合元素
- 删除 list 末尾的元素,用 pop() 方法,删除指定位置用 pop(i) 方法,其中 i 是索引位置
- 在 tuple 里指定义一个元素时,必须加一个逗号来消除歧义
>>> t = (1,)
>>> t
(1,)
循环
- for … in 循环,依次把 list 或 tuple 中的每个元素迭代出来
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name
- range() 函数生成一个整数序列, range(x) 生成从 0 开始小于 x 的整数,再可以用 list() 函数转换为 list
dict 与 set
dict:
- 使用键-值(key-value)存储,具有极快的查找速度
- 一个 key 只能对应一个 value,所以,多次对一个 key 放入 value,后面的值会把前面的值冲掉
- 要避免 key 不存在的错误,有两种办法,一是通过 in 判断 key 是否存在:
>>> 'Thomas' in d
False
二是通过 dict 提供的 get() 方法,如果 key 不存在,可以返回 None,或者自己指定的value:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
- 删除一个key,用 pop(key) 方法,对应的 value 也会从 dict 中删除
- 与 list 比较,dict 有以下几个特点:
查找和插入的速度极快,不会随着 key 的增加而变慢;
需要占用大量的内存,内存浪费多。
而 list 相反:
查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。 - 在 Python 中,字符串、整数等都是不可变的,可以作为 key。而 list 是可变的,所以不能作为 key
set:
- set 也是一组 key 的集合,但不存储 value。由于 key 不能重复,所以在 set 中,没有重复的 key。
- 创建一个 set,需要提供一个 list 作为输入集合
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
- 重复元素在 set 中自动被过滤
- add(key) 方法可以添加元素,可以重复但是没效果;remove(key) 方法可以删除元素
- set 可以看成数学意义上的无序和无重复元素的集合,因此,两个 set 可以做数学意义上的交集、并集等操作