ChapterTwo
内置序列类型
容器序列
- list, tuple和collections.deque这些序列能存放不同类型的数据
扁平序列
- str、bytes、bytearray、memoryview和array.array,这类序列只能容纳一种类型
可变序列
- list、bytearray、array.array、collection.deque和memoryview
不可变序列
- tuple、str、bytes
list是一个可变序列,能够同时存放不同类型的元素
列表推导式
也可以叫做列表生成式,它的作用就是生成列表
把字符串变成相应的整数表示,就是unicode码位的列表
|
|
使用列表推导式
|
|
列表推导变量泄露问题
在python2中,列表推导式中的for关键字之后的赋值操作可能会影响到列表推导上下文中的同名变量
这里x的值被取代了
|
|
Python3中就不会出现变量泄露的问题
x的值被保留了,列表推导式也生成了新的列表
|
|
笛卡儿积
两个或以上的列表中的元素对构成元组,这些元组构成的列表就是笛卡儿积
看一下维基的解释,再结合代码就能很容易理解了
colors和sizes两个元素对列表,然后使用列表推导式,先以颜色为排列,再以尺码排列
|
|
这里用两个for循环嵌套也可以得出上面的结果
先颜色后尺码
|
|
这里再换个需求,先尺码后颜色,只需要调换for循环的顺序即可
|
|
生成器表达式
生成器表达式遵守了迭代协议,可以逐个产出元素,而不是直接生成一个列表;它是边循环边计算的,这样做的目的就是节省内存
生成器表达式的语法就是把列表表达式的方括号[],改成圆括号()
使用生成器表达式计算笛卡儿积
|
|
执行结果:
用生成器表达式后,每次执行只会生成一个结果,直到最后一个元素抛出StopIteration
|
|
用for循环看下结果
|
|
元组
元组拆包(unpacking)
平行赋值
|
|
用*来处理剩下的元素
|
|
平行赋值中,*前缀只能用在一个变量名前面,但它可以在任意位置
|
|
嵌套元组拆包
元组是可以嵌套的,(a, b(c, d), e, f)
具名元组(namedtuple)
collections.namedtuple是一个工厂函数,用来构建一个带字段名的元组和一个有名字的类
先来个简单的,namedtuple创建了一个tuple对象,它也是不可变的,它可以用属性来访问元素,而不再是用索引
|
|
再来看一个复杂点的
|
|
namedtuple的专有属性
- _fields类属性
- _make(iterable)类方法
- _asdict()实例方法
切片(slicing)
给切片赋值
|
|
一个关于+=的谜题
t[2]被改动了,但也有异常抛出
|
|
用extend就可以避免抛出异常
|
|
list.sort()方法和内置函数sorted()
- sort()方法会就地排序列表,它会永久性改变列表,并且不会复制原列表
- sorted()方法是临时排序列表,它会新建一个列表作为返回值
- reverse 默认值是False,如果设定为True 就会反序排序
- key key=str.lower()忽略大小写的排序;key=len基于字符串长度的排序
|
|
deque(双向队列)
使用list按索引访问速度很快,但插入和删除速度就慢了。list是线性存储,插入和删除的效率很低,这时候需要用到deque来高速进行插入和删除操作,适用于队列和栈
|
|