列表推导
列表推导是构建列表List的快捷方式,说它是快捷方式,其实就蕴含了两个内在含义:1、它在可读性和执行速度上有优势,2、你当然可以选择不使用这种方法;
举个例子,我们把一个字符串中的所有元素都转化成其对应的Unicode编码,并把结果储存在一个列表中,从另一种意义上来说,我们也就是从无到有地构建了这个列表,最直观(也是看完了前面十几讲就应该掌握)的方法是:
Str_Source = '#$*(HS'
List_Target = []
for sep in Str_Source :
List_Target.append(ord(sep))
print(List_Target)
#结果如下:
[35, 36, 42, 40, 72, 83]
这里用了一个For循环,用Sep指代每个元素,并使用Ord()函数讲元素转化成对应的Unicode编码,再后缀到目标列表末尾,关于Unicode编码,等一会儿再提一下;
那么我们的快捷方式是这样的:
Str_Source = '#$*(HS'
List_Target = [ord(sep) for sep in Str_Source]
print(List_Target)
#结果如下:
[35, 36, 42, 40, 72, 83]
列表推导在合理利用的时候会提高执行速度,但列表推导一旦比较冗长或者内里有复杂的逻辑关系,就会造成我们不期望的后果(当然也不会出错),所以虽然列表推导可以强大到完全代替For循环,但仍然建议只把它应用在构建列表方面并且严格限制代码长度(不大于两行是可以接受的);
还有一点要注意的是,Python还内置了map和filter两个函数,如果写的时候不怕麻烦的话也可以实现相同的功能,而且速度和列表推导半斤八两,这两个函数可能以后会写到吧;
我们不妨再来尝试一个列表推导的小例子——笛卡尔积;
笛卡尔积是这样一种东西,我们可以把元素理解成一个具有两种属性的物品,这些属性任意组合的全体就是两个属性的笛卡尔积,最简单的例子就是扑克牌——每一张扑克牌都有花色和数字两种属性,这两种属性所有的组合形式就构成了一套扑克牌;
就来组合一套扑克牌试试看:
List_Color = ['♠️' , '♣️' , '♥️' , '♦️']
List_Numb = ['A',2,3,4,5,6,7,8,9,10,'J','Q','K']
List_Poker = [(color,numb) for numb in List_Numb
for color in List_Color]
print(List_Poker)
#结果如下(本菜鸡做了分行):
[('♠️', 'A'), ('♣️', 'A'), ('♥️', 'A'), ('♦️', 'A'),
('♠️', 2), ('♣️', 2), ('♥️', 2), ('♦️', 2),
('♠️', 3), ('♣️', 3), ('♥️', 3), ('♦️', 3),
('♠️', 4), ('♣️', 4), ('♥️', 4), ('♦️', 4),
('♠️', 5), ('♣️', 5), ('♥️', 5), ('♦️', 5),
('♠️', 6), ('♣️', 6), ('♥️', 6), ('♦️', 6),
('♠️', 7), ('♣️', 7), ('♥️', 7), ('♦️', 7),
('♠️', 8), ('♣️', 8), ('♥️', 8), ('♦️', 8),
('♠️', 9), ('♣️', 9), ('♥️', 9), ('♦️', 9),
('♠️', 10), ('♣️', 10), ('♥️', 10), ('♦️', 10),
('♠️', 'J'), ('♣️', 'J'), ('♥️', 'J'), ('♦️', 'J'),
('♠️', 'Q'), ('♣️', 'Q'), ('♥️', 'Q'), ('♦️', 'Q'),
('♠️', 'K'), ('♣️', 'K'), ('♥️', 'K'), ('♦️', 'K')]
两层逻辑上的推导之间可以加一个换行,这样代码的可读性就更高了,反正Python不会管这个;
生成器
列表推导可以用来建立一个列表,然后我们可以用这个列表来建立其他的卧槽类型,但其实我们也可以直接用生成器表达式来搞定一个其他卧槽类型;
生成器表达式的语法很简单,就是把列表推导里的[]换成()就完了,它的内在实现方法,我们先留一个坑;
无论是列表推导还是生成器,都按照Python一个基础的语言架构——迭代而逐渐成型。
网友评论