列表推导
列表推导的书写形式:
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
一个简单的例子:
symbols = '%^&*()'
codes = [ord(symbol) for symbol in symbols]
print(codes)
输出:[37, 94, 38, 42, 40, 41]
使用列表推导的原则是:只用列表推导来创建新的列表,并且尽量保持简短,如果列表推导的代码超过两行,就需要考虑使用for循环重写
一个稍微复杂点的例子--使用列表推导计算笛卡尔乘积:
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
tshirts = [(color, size) for color in colors
for size in sizes]
print(tshirts)
输出:[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
生成器表达式
虽然列表推导可以用来生成远足,数组或者其他序列类型,但是使用生成器表达式是更好的选择。因为列表推导是先建立一个完整的列表,然后把这个列表传递到某个构造函数里,如果裂变的长度太长,占用的内存就比较多。而生成器表达式遵守迭代器协议,可以逐个地产生元素。
生成器表达式与列表推导形式差不多,只不过将[]换成()
例子:
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
for tshirt in ((c,s) for c in colors for s in sizes):
print(tshirt)
输出:
('black', 'S')
('black', 'M')
('black', 'L')
('white', 'S')
('white', 'M')
('white', 'L')