一、列表推导式
推导式是可以从一个数据序列构建另一个新的数据序列。列表推导式,采用简洁方式对列表或其他可迭代对象的元素进行遍历、过滤或再计算,快速生成满足特定需求的新序列。
列表推导式语法形式:
[expression for expr1 in sequence1 if condition1
????????????????????????for expr2 in sequence2 if condition2
????????????????????????????????for expr3 in sequence3 if condition3
......]
>>> alist = [ x**x for x in range(6)]
>>> alist
[1, 1, 4, 27, 256, 3125]
>>> blist = []
>>> for x in range(6):
... blist.append(x**x)
...
>>> blist
[1, 1, 4, 27, 256, 3125]
>>> alist == blist
True
?逻辑上,列表推导式等价于循环结构。列表推导式功能强大,可实现嵌套列表的平铺,过滤指定元素,同时遍历多个迭代对象,实现矩阵转置等等。
推导式不仅适用于列表,Python还支持使用于字典,集合。
1、实现嵌套列表平铺
>>> alist = [[1,2,3],[4,5,6],[7,8,9]]
>>> [num for elem in alist for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
2、过滤不符合条件的元素
>>> alist = [5,6,7,8,4,2,11,14]
>>> [num for num in alist if num%2==0]
[6, 8, 4, 2, 14]
3、同时遍历多个可迭代对象
>>> [(x,y) for x in [2,5,6,7,1,11] for y in [3,4,7,1,11] if x==y]
[(7, 7), (1, 1), (11, 11)]
4,列表推导式实现矩阵转置
>>> matrix = [[4,1,2,5],[6,8,2,4],[6,4,1,8]]
>>> [[row[i] for row in matrix] for i in range(4)]
[[4, 6, 6], [1, 8, 4], [2, 2, 1], [5, 4, 8]]
二、生成器推导式
生成器推导式与列表推导式在用法上非常相似,形式上生成器推导式以圆括号为定界符,生成器推导式的结果是一个生成器对象,而不是列表,也不是元组。
生成器推导式具有惰性求值的特点。使用生成器推导式时,可以选择将其转化为列表或者元组形式,或者使用生成器对象的__next__()的办法(或内置函数next())进行遍历。
在遍历元素时,只能从前往后正向访问。无法重新访问已访问过的元素,特殊的是不支持使用下标方式来访问其对象元素。若需要继续访问,必须重新构建该生成器对象。
>>> agoal = (x**x for x in range(6)) #构建生成器推导式对象
>>> agoal
<generator object <genexpr> at 0x000001B993949A10>
>>> list(agoal)
[1, 1, 4, 27, 256, 3125]
>>> agoal.__next__() #已访问结束,无法重新访问
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> agoal = (x**x for x in range(6)) #重新构建
>>> next(agoal)
1
三、序列解包功能
?序列解包,是Python中一个非常重要的功能,巧妙使用能可提高代码的高效性和可读性。序列解包适用于range()可迭代对象,列表,字典,enumerate对象,zip对象等。其中注意,序列解包对字典默认是对“键”操作,item()方法可以实现对“键:值”操作。
>>> keys = ['a','b','c','d']
>>> values = [1,2,3,4]
>>> for akey,aval in zip(keys,values):
... print((akey,aval),end=' ')
...
('a', 1) ('b', 2) ('c', 3) ('d', 4)
>>> x,y,z = range(3)
>>> y
1
>>> ad,*bd,cd = 14,12,13,41
>>> bd
[12, 13]
|