38.序列解包
序列解包
可以用于元组、列表、字典
。 序列解包可以让我们方便的对多个变量赋值。
普通解包
>>> x,y,z=(20,30,10)
>>> x
20
>>> y
30
>>> z
10
>>> (a,b,c)=(9,8,10)
>>> a
9
>>> [a,b,c]=[10,20,30]
>>> a
10
>>> b
20
也可以这样解包
cookie = 'BIDUPSID=6AE26F43446A5C1F4F5F5C4E412DC9FF;PSTM=1581078121; BD_UPN=12314753;delPer=3; BD_CK_SAM=1;sugstore=1;ZD_ENTRY=baidu;PSINO=5;'
print('-' * 30)
c_li = cookie.replace(" ", "").split(';')
[(k1, v1), (k2, v2), (k3, v3), (k4, v4), (k5, v5), (k6, v6), (k7, v7),
(k8, v8)] = [tuple([x for x in i.split("=")]) for i in c_li][:-1]
# 也就是以下 效果 类似。
In [35]: [[a,b],[c,d]]=[[1,2],[3,4]]
In [36]: a
Out[36]: 1
In [37]: b
Out[37]: 2
In [38]: c
Out[38]: 3
In [39]: d
Out[39]: 4
字典解包
序列解包用于字典
时,默认是对“键”进行操作; 如果需要对键值对
操作,则需要使用items()
;如果需要对“值”进行操作,则需要使用 values()
;
>>> s = {'name':'onepis','age':18,'job':'teacher'}
>>> name,age,job=s #默认对键进行操作
>>> name
'name'
>>> name,age,job=s.items() #对键值对进行操作
>>> name
('name', 'onepis')
>>> name,age,job=s.values() #对值进行操作
>>> name
'onepis'
其他解包
In [45]: a,b,c=map(str,range(3))
# 另外 序列解包 也可以直接用于生成器。 和 for 循环
In [46]: a
Out[46]: '0'
In [47]: b
Out[47]: '1'
In [48]: c
Out[48]: '2'
# 另外 序列解包 也可以直接用于生成器。 和 for 循环
# enumerate 返回的 是 一个 元组 里面 包含 一个 索引 。 一个 元素
# 解包 到 i 和 v 上
In [53]: *((i,v) for i,v in enumerate(range(3))),
Out[53]: ((0, 0), (1, 1), (2, 2))
In [55]: a=[3,4,5] # 这样 换个变量 来测试 。 更直观一点
In [56]: *(i for i in enumerate(a)), # 后面 加一个 逗号。 利用 元组的特性来 解包。
# 列表也可以这样解包。 但是 返回的 依然是元组。
Out[56]: ((0, 3), (1, 4), (2, 5))
# 最简单的测试是 以下
In [58]: *range(3),
Out[58]: (0, 1, 2)