Python进阶3——列表解析式和生成器表达式

列表解析式相比循环更加简介易读

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》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值