序列解包
任何的可迭代对象(iterable)都可以通过一个简单的赋值语句(或者说序列解包功能)同时赋值给多个变量,但前提是变量个数可可迭代对象中的元素个数要一致,否则会抛出异常。
- 使用序列解包功能对多个变量同时赋值:
>>>x,y,z=1,2,3
>>>x,y,z=range(3) #使用range对象进行序列解包
>>>tuple=(1,2,'3')
>>>x,y,z=tuple #变量与元素个数要一致
>>>x,y,z=map(str,range(3)) #使用可迭代对象进行序列解包
- 使用序列解包同时遍历多个序列:
>>>keys=['a','b','c']
>>>values=['1','2','3']
>>>for k,v in zip(keys,values):
print(k,v)
a 1
b 2
c 3
- 序列解包对字典操作
序列解包用于操作字典是默认是对字典“键”进行操作,如果需要对“键:值”操作需要用items()方法说明,如果需要对“值”进行操作则需要使用values()方法明确指定。
>>>s={'a':1,'b':2,'c':3}
>>>b,c,d=s.items() #items()方法明确是对“键:值”操作
>>>print(b)
('a', 1)
- 在做unpack时候对于想舍弃的值可以将其赋值给用不到的变量(如:“_”)
- “*表达式” 的应用(可结合用不到的变量滤掉无用的值)
在可迭代对象元素较多时对于不需要的元素可以解包存入 列表 中赋给*表达式
*表达式
在序列解包中可以位于开头,中间和结尾,但注意一个序列解包语句中只能有一个*表达式
,否则会抛出如下异常
File "C:\Users\asus\Desktop\py-script", line 2
a,*b,*c=s
^
SyntaxError: two starred expressions in assignment
#位于结尾
>>>s=[1,2,3,4,5,6,7,8,9]
>>>a,b,*c=s
>>>print(a)
>>>print(b)
>>>print(c)
1
2
[3, 4, 5, 6, 7, 8, 9]
#位于中间
>>>s=[1,2,3,4,5,6,7,8,9]
>>>a,*b,c=s
>>>print(a)
>>>print(b)
>>>print(c)
1
[2, 3, 4, 5, 6, 7, 8]
9
#位于开头
>>>s=[1,2,3,4,5,6,7,8,9]
>>>*a,b,c=s
>>>print(a)
>>>print(b)
>>>print(c)
[1, 2, 3, 4, 5, 6, 7]
8
9
不难发现这种星号加表达式的语法可以很容易实现递归算法(这种星号加表达式的分割用法在算法中用得很多)
>>> items = [1, 10, 7, 4, 5, 9]
>>> def sum(items):
head, *tail = items
return head + sum(tail) if tail else head
>>> sum(items)
36
- 另外,序列解包还支持下面的用法:
>>>print(*[1,2,3],4,*(5,6))
1 2 3 4 5 6
>>>print(*range(4),4)
0 1 2 3 4
>>>{*range(4),4,*(5,6,7)}
{1,2,3,4,5,6,7}
>>>{'x':1,**{'y':2}} #注意是双星号
{'x': 1, 'y': 2}
对于序列解包的这几种用法其实我也不是很明白,找了很久也没找到相关的用法的讲解,就照搬书上的这几种用法了!有看到相关知识点会第一时间在这篇博客更新!有知道的大神麻烦评论区或者私我!谢谢大嘎!
注:部分代码来自清华大学董付国老师编著的《Python可以这样学》,特别感谢!