Time: 2019-08-02
书籍: 《流畅的Python》
数据火车:文本,列表,表格。
Python处理序列数据的方式是统一的风格,无论是哪种数据结构:
- 字符串
- 列表
- 字符串
- 字节序列
- 数组
- XML元素
- 数据库查询结果
在Python中都可以共用一套操作:
- 迭代
- 切片
- 排序
- 拼接
在Python这里,标准库中的序列类型有:
-
容器类序列
- list
- tuple
- collections.deque
-
扁平序列
- str
- bytes
- bytearray
- memoryview
- array.array
其中,扁平序列只能容纳一种类型,且存放的是值,容器序列可以存放任意类型的对象的引用。
从可变性角度划分
-
可变序列
- list
- bytearray
- array.array
- collections.deque
- memoryview
-
不可变序列
- tuple
- str
- bytes
其中,list
是最重要、最基础的序列类型,这是个可变序列,可同时存放不同类型的元素。
接下来复习列表推导功能。
列表推导(list comprehension)
这是一种构建列表的方法。
掌握列表推导是通往生成器表达式(generator expression)的必经之路。
列表推导使用案例:
symbols = 'abcdefg'
codes = [ord(symbol) for symbol in symbols]
使用原则:只用列表推导来创建新的列表,并保持简短。若超过了两行,可以考虑用for循环。
列表推导与filter,map的比较
symbols = 'acfjlmopq'
beyond_ascii = [ord(s) for s in symbols if ord(s) > 100]
beyond_ascii = list(filter(lambda c: c > 127, map(ord, symbols)))
双重循环生成笛卡尔积案例
# 双重循环
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
tshirts = [(color, size) for color in colors for size in sizes]
tshirts
'''
[('black', 'S'),
('black', 'M'),
('black', 'L'),
('white', 'S'),
('white', 'M'),
('white', 'L')]
'''
生成器表达式
生成器表达式遵守迭代器协议,可以逐个产出元素,不是先建立一个完整的列表。
所以生成器表达式方式还可以节省内存。
重点来了:生成器表达式的语法是把列表推导中的方括号变成圆括号。
symbols = 'åœ∑®©†¥˙'
tuple(ord(symbol) for symbol in symbols)
# (229, 339, 8721, 174, 169, 8224, 165, 729)
元组
元组不仅仅是不可变的列表,还可以用作:
- 记录
- 元组拆包
- 具名元组:collections.namedtuple()
END.