列表解析式相比循环更加简介易读
abc='abcdef'
codes1=[]
for code in abc:
codes1.append(ord(code))#返回字符对应的十进制数。
codes2=[ord(code) for code in abc]
print(codes1)
print(codes2)
同样的结果,循环三行代码,而列表解析式只需要一行,更加简洁易读
在某些情况,用filter和map生成的列表,用列表解析式的话会更加简洁
codes3=[ord(code) for code in abc if ord(code)>100]
codes4=list(filter(lambda c:c>100, map(ord, abc)))
print(codes3)
print(codes4)
列表生成式比filter和map的组合可读性更强
filter函数的第一个参数是函数对象,函数对象可以是lambda表达式,也可以是函数名,作用是根据函数对象,对序列进行过滤
map函数的第一个参数也是函数对象,作用是根据函数对象对序列进行映射
上述代码先通过map函数将abc中的每个字符映射为十进制数,然后通过lambda表达式过滤出大于100的十进制数,最后放入一个列表中
通过列表解析式组合衣服的尺码和颜色
colors=['black','white','red','yellow']
sizes=['s', 'm', 'l']
clothes1=[(color, size) for color in colors for size in sizes]
clothes2=[(color, size) for size in sizes for color in colors]
print(clothes1)
print(clothes2)
上述两个clothes列表的个数相同,但是生成过程不同,clothes1先取得每个颜色,然后匹配每个颜色对应的size,clothes2先取得每个size,然后匹配每个size对应的颜色
上述两个列表的差别在于for循环的顺序不同
生成器表达式和列表解析式类似,只不过列表解析式的结果是用中括号,而生成器表达式的结果是小括号
codes5=(ord(code) for code in abc)
codes6=tuple(ord(code) for code in abc)
codes7=list(ord(code) for code in abc)
print(codes5)
print(codes6,'\n', codes7)
生成器表达式只返回一个迭代器,如果需要显示迭代器的内容,需要将迭代器传入list函数or tuple函数
生成器表达式执行时,会把元素逐个生成,而不会向列表解析式那样一次生成所有元素,这样不仅省内存(因为不会生成所有元素),也省了for循环时间(遍历生成时间)
通过生成器表达式组合衣服的尺码和颜色
colors=['black','white','red','yellow']
sizes=['s', 'm', 'l']
for clothes in ((size, color) for size in sizes for color in colors):
print(clothes)
可见,每个clothes都是一个元组
参考:
《流畅的Python》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出