全面深入了解python(二)
1. 序列构成的数组
1.1 内置序列类型概览
python标准库用C实现了丰富的序列类型:
容器序列:
list、tuple和collections.deque这些序列能存放不同类型的数据。
扁平序列:
str、bytes、bytearray、memoryview和array.array,这类序列只能存放一种类型的数据。
容器序列存放的是它们所包含的任意类型的对象的引用,而扁平序列里存放的是值而不是引用。换句话说,扁平序列其实是一段连续的内存空间。扁平序列更加紧凑,但是只能存放字符、字节和数值这种基础类型。
序列类型按照能否被修改分类:
可变序列:
list、bytearray、collections.deque、memoryview和array.array
不可变序列:
tuple、str和bytes
1.2 列表推导和生成器表达式
列表推导是构建列表的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。
1.2.1 列表推导和可读性
传统的构建列表
>>> pre_ord = '!@#$%^'
>>> codes = []
>>> for spec in pre_ord:
... codes.append(ord(spec))
...
>>> codes
[33, 64, 35, 36, 37, 94]
另外一种写法:
>>> pre_ord = '!@#$%^'
>>> codes = [ord(spec) for spec in pre_ord]
>>> codes
[33, 64, 35, 36, 37, 94]
显然第二种写法更为方便和具有可读性,如果列表推导的代码超过了2行,可以考虑使用for循环,没有必要强行使用列表推导式。
1.2.2 列表推导同filter和map的比较
filter和map合起来能做的事情,列表推导也可以做,而且还不需要借助lambda表达式。
>>> pre_ord = '!@#$%^'
>>> after_ord = [ord(s) for s in pre_ord if ord(s) < 50]
>>> after_ord
[33, 35, 36, 37]
>>> after_ord = list(filter(lambda c : c < 50,map(ord,pre_ord)))
>>> after_ord
[33, 35, 36, 37]
1.3 笛卡尔积
如果你需要一个列表,列表里是3种不同尺寸的外套,每种外套都有2种颜色。
>>> colors = ['black','white']
>>> sizes = ['S','M','L']
>>> coats = [(color,size) for color in colors for size in sizes]
>>> coats
[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'