一、列表解析List Comprehension
语法:
返回值for元素in可迭代对象if条件
使用中括号[],内部是for循环,if条件语句可选
返回一个新的列表
列表解析式作用:
编译器会优化,不会因为简写而影响效率,反而因优化提高效率
减少程序员工作量,减少出错
简化代码,可读性增强
例:
获取10以内的偶数
even1=[]
for x in range(10):
if x%2==0:
even1.append(x)
even2=[i for i in range(10) if i%2==0]
print(even1,even2)
二、列表解析进阶
表达式:【expr for i in iterable1 for in iterable2】
等价于
ret=[]
for i in iterable1:
for j in iterable2:
ret.append(expr)
举例
[(x,y) for x in 'abcd' for y in range(3)]
[[x,y] for x in 'abcd' for y in range(3)]
[{x,y} for x in 'abcd' for y in range(3)]
[(i,j) for i in range(7) if i>4 for j in range(20,25) if j>23]
[(i,j) for i in range(7) for j in range(20,25) if i>4 if j>23]
[(i,j) for i in range(7) for j in range(20,25) if i>4 and j>23]
注:列表解析不支持elif,多个if相当于用and连接
三、生成器表达式Generator expession
语法:
(返回值 for 元素 in 可迭代对象 if 条件)
列表解析式的中括号换成小括号就行
返回一个生成器
和列表解析式的区别:
1.生成器表达式是按需计算(或称惰性计算、延迟计算),需要的时候才计算值;列表解析式
是立即返回值
2.生成器表达式是返回迭代器可以迭代;列表解析式返回的不是迭代器,返回可迭代列表
3.生成器从头到后走完一遍后,不能回头;列表解析式可以重复走
生成器
可迭代对象
迭代器
四、集合解析式
语法
{返回值for元素in 可迭代对象 if条件}
列表解析式的中括号换成大括号{}就行
立即返回一个集合
例:
{(x,x+1) for x i in range(10)}
五、字典解析式
语法
{返回值for元素in 可迭代对象 if条件}
列表解析式的中括号换成大括号{}就行
使用key:value形式
立即返回一个字典
例:
{str(x):(y,4) for x in range(4) for y in range(4)}