序列解包要求等号左侧的变量数量与序列中的元素数量一样多。请注意,多重赋值实际上只是元组打包和序列拆包的组合。如果变量个数和序列元素的个数不匹配,会抛出ValueError异常。
对应匹配赋值:
features = ['5', 'boy', 'student']
age, gender, identity = features # age = '5' gender = 'boy' identity ='student'
a,c=features # ValueError: too many values to unpack
a,b,c,d,e=features # ValueError: need more than 3 values to unpack
a,b,c={1,2,3} # a=1,b=2,c=3
a,b,c,d,e='hello' # a='h',b='e',c='l',d='l', e='o' 左边值必须和右边的值是一一对应的关系,否则会报错
a,c=features
分配和交换多个变量
f1=1
f2=2
f1,f2=f2,f1 # f1=2, f2=1
解压一部分元素:占位符和通配符配合使用可以舍弃解压部分元素,注意只能在python3X生效,否则报语法错误
l=[10,1,2,3,5,8,9]
a,*_,c=l # a=10,c=9,_=[1,2,3,5,8]
a,*b,c=l # b=[1,2,3,5,8] _或b即变量名,不能省略
print(*_) # 1 2 3 5 8
_,m,n,g,_=l # _='9'
a,b,*_=l # a=10, b=1, *_=2 3 5 8 9, _=[2,3,5,8,9]
扩展的迭代解压语法:
专门为解压不确定个数或任意个数元素的可迭代对象而设计的。
通常,这些可迭代对象的元素结构有确定的规则, 星号表达式(通配符)让开发人员可以很容易的利用这些规则来解压出元素来。 而不是通过一些比较复杂的手段去获取这些关联的的元素值。
通配符表达式在迭代元素为可变长元组的序列和字符串操作都是很有用的,比如字符串的分割,注意只能在python3X生效。
迭代元素为可变长元组的序列举例:
list = [
('chen', '98', '100'),
('zhang', '58',),
('chen', '80', '76'),
]
def chen(x, y):
print('chen', x, y)
def zhang(s):
print('zhang', s)
for firstname, *args in list:
if tag == 'chen':
firstname(*args)
elif tag == 'zhang':
firstname(*args)
# result:
chen 98 100
zhang 58
chen 80 76
字符串操作
line = 'nobody:*:-2:Unprivileged User:/var/empty:/usr/bin/false'
uname, *fields, homedir, sh = line.split(':')
# *fields=['*','-2','Unprivileged User'] homedir=/var/empty
实现递归算法
items = [1, 10, 7, 4, 5, 9]
def sum(items):
head, *tail = items
# 如下语句,等效于:return head + sum(tail) if tail else head
if tail:
return head + sum(tail)
else:
return head
print(sum(items))
参考文档:
1.1 解压序列赋值给多个变量 — python3-cookbook 2.0.0 文档:
https://python3-cookbook-personal.readthedocs.io/zh_CN/latest/c01/p01_unpack_sequence_into_separate_variables.html