1、语法
[返回值 for 元素 in 可迭代对象 if 条件]
使用中括号[],内部是for循环,if条件语句可选
返回一个新列表
进阶:
[expr for i in iterable for j in iterable2]
等价于:
ret=[]
for i initerable1:
for j in iterable2:
ret.append(expr)
例:
lst=[(x,y) for x in 'abcde' for y in range(3)]
lst=["{}*{}={}".format(j,i,i*j)for i in range(1,10) for j in range(1,10)if i>=j]
2、生成器(***)
表达式Generator expression
语法:(返回值 for 元素 in 可迭代对象 if 条件)
列表解析式的中括号换成小括号就行了
返回一个生成器
与列表解析式的区别
生成器表达式是按需计算(或称惰性求值,延迟计算),需要的时候才计算值
列表解析式是立即返回值
生成器生成的可迭代对象只能迭代一次,列表解析式的迭代对象可以反复迭代
生成器生成的可迭代对象可以用next(),next()可以一个个取生成的迭代对象里面的值
生成器本省并没有返回任何值,只返回了一个生成器对象
列表解析式构造并返回了一个新的列表
3、集合解析式
语法:{返回值for 元素 in 可迭代对象 if 条件}
列表解析式的中括号换成大括号{}就行了
立即返回一个集合
4、字典解析式
语法:{返回值 for 元素 in 可迭代对象 if 条件}
列表解析式的中括号换成大括号{}就行了
使用key:value形式
立即返回一个字典
例:{str(x):y for x in range(3) for y in range(4)}
等价于:
ret={}
for x in range(3):
for y in range(4):
ret[str(x)]=y
例:
试着用解析式的方法完成九九乘法:
print(' '.join([' '.join(['%s*%s=%-3s'%(x,y,y*x)for x in range(1,y+1)]) for y in range(1,10)]))
[print('{}*{}={:<3}{}'.format(j,i,i*jk,' ' if i==j else ' '),end=" ")for i in
range(1,10)for j in range(1,i+1)]