列表解析是Python迭代机制的一种应用,常用于实现创建新的列表。 列表解析式简化了代码,使代码的可读性增强;编译器在内部作了优化,不会因为简写而影响效率,反而提高了效率。
基本语法:
练习题:生成一个列表,元素是1-9,返回这个列表元素自增1后平方的列表
[(i+1)**2 for i in range(10)]
#对应的for循环实现:
list1 = []
list2 =list(range(10))
for i in list2:
list1.append((i+1)**2)
print(list1)
print([i for i in range(10) if i%2 == 0])
#结果:[0, 2, 4, 6, 8]
print([i if i ==0 else 100 for i in range(10)])
#结果 : [0, 100, 100, 100, 100, 100, 100, 100, 100, 100]
#以上表达式等价于:
ret = []
for i in iterable1:
for j in iterable2:
ret.append(expr)
来看两个小例子:
['{}=={}'.format(i,j) for i in range(5) for j in range(5)]
#对应的for 循环实现
lst1 = []
for i in range(5):
for j in range(5):
lst1.append('{}=={}'.format(i,j))
print(lst1)
------------------------------------------------------------
结果:['0==0', '0==1', '0==2', '0==3', '0==4', '1==0',
'1==1', '1==2', '1==3', '1==4', '2==0', '2==1',
'2==2', '2==3', '2==4', '3==0', '3==1', '3==2',
'3==3', '3==4', '4==0', '4==1', '4==2', '4==3',
'4==4']
[['{}=={}'.format(i,j) for i in range(5)] for j in range(5)]
#对应的for循环实现:
lst1 = []
for j in range(5):
lst2 = []
for i in range(5):
lst2.append('{}=={}'.format(i,j))
lst1.append(lst2)
print(lst1)
--------------------------------------------------------------
结果:[
['0==0', '1==0', '2==0', '3==0', '4==0'],
['0==1', '1==1', '2==1', '3==1', '4==1'],
['0==2', '1==2', '2==2', '3==2', '4==2'],
['0==3', '1==3', '2==3', '3==3', '4==3'],
['0==4', '1==4', '2==4', '3==4', '4==4']
]
注意上面两个解析式的区别,它们在进入循环时的顺序不一样。
来看两个练习题:
#在屏幕上打印九九乘法表
[print('{}*{}={:<{}}'.format(i,j,i*j,2 if j==1 else 3 ),end='\n'if i==j else ' ') for i in range(1,10) for j in range(1,i+1,)]
print( '\n'.join([' '.join(['{}*{}={:<2}'.format(y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))
-----------------------------------------------------------------------------------------
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
生成数字和随机字母组成的id号:
import random
['{:04}.{}'.format(i,''.join(random.choices(bytes(range(97,123)).decode(),k=10))) for i in range(1,11)]
-------------------------------------------------------------------------------------------
['0001.lfykqlniww',
'0002.jjmxavbxsw',
'0003.geutsojqnh',
'0004.tenatpjmqq',
'0005.bruubbhpgw',
'0006.sebvteldqe',
'0007.dpuplfmsjm',
'0008.sxmiwcyxqe',
'0009.rdanbpslpn',
'0010.jzeyqmffmj']