参考资料: book video ### 列表推导 生成一个循环列表

1
a=[i for i in range(5)]

生成一个双循环列表

1
2
3
4
5
a=[(i,j) for i in range(5) for j in list('ABCD')]
等价于
for i in range(5):
for j in list('ABCD'):
a.append((i,j))
生成(0,2,4,6,8)
1
a=[i*2 for i in range(5)]
替代filter筛选循环
1
a = [i for i in range(5) if i < 3]
### 生成器表达式
1
2
3
4
5
6
7
8
9
def gen(x):
yield n
yield n+1

g=gen(1)
for i in g:
print(g)

每调用一次gen函数,依次得到一个yield
1
2
3
4
5
6
7
8
生成器表达式
g = (i for i in range(10))

#只是生成了一个生成器,内存大小不随range改变,只有当调用个时才会生产yield

for i in g:
print(g)

### 解包和拆包
1
2
3
4
5
a = (20,8)

a1,a2=a——标准的元组解包

print(divmod(*a))#省去显示拆包
1
2
3
4
a1,*rest=range(0,5)
#a1为第一个元素,剩下的放在rest里面,为列表
a1,*rest,a2=range(0,5)
#a1,a2单独,剩下的放rest列表
1
2
3
4
嵌套解包
city=[('Hangzhou','Zhejiang',('0571','310000')),('Guangdong','Guangzhou',('0755','210000'))]
for name,prov,(code,postcode) in city:
print(postcode)
### 序列的增量赋值
1
2
3
4
5
6
7
8
a=range(5)
b=range(5,10)
a=a+b
>>>返回的list为新地址,和原本a的不一样

a+=b
>>>返回的list为原来的旧地址,和原本a一样

若a和b都为元组,则无论是+=还是+都是新地址,因为元组本身就是不可改变的,不能直接在指向旧地址的a后面延长。