在上一节,我们将序列分解为单独的变量,有个前提是 必须 变量的个数和序列的长度一样。否则就会报错。
当一个可迭代的对象或者序列的元素数量超过变量数量时候,就会抛出异常。比如下面的例子
代码语言:javascript复制 data = ['hello1','hello2','hello3']
a ,b ,c ,d =data #报错 ValueError: not enough values to unpack (expected 4, got 3)
a , b = data #报错ValueError: too many values to unpack (expected 2)
**这一节的内容就是要把可迭代对象赋值给多个变量,就算变量数量比可迭代的对象的数量少。 假设有一个需求是这样的。有一个列表,我想把列表的前2个值赋值给2个变量,后面列表的数量我不知道有几个,而且我也不需要。该怎么实现呢** list1 = ['hxd1', 'hxd2', '110', '119']
- 常规思路就是 a1=list1[0] , b1=list1[1] 。这个没啥好说的
- a,b =list1 。毫无疑问这样会报错。因为list1有4个元素 此时,我们就可以使用*变量 这种方法。
a,b,*c = list1
print(a,b,c) #hxd1 hxd2 ['110', '119']
print(type(c)) #
根据输出可以看到,a 和b已经符合要求了。剩下的c接住了所有的变量,不管列表后面还有多少元素,都会赋给c。 而且可以看到c的类型是list
当然*c 这种操作,不止可以放到列表结尾,也可以放到列表的开头部分。
代码语言:javascript复制list2=['1','2','3','4','hxd']
*num,name = list2
print(num,name) # ['1', '2', '3', '4'] hxd
print(type(num)) #
当然*c 这种操作,不止可以放到列表结尾,也可以放到列表的中间部分。
代码语言:javascript复制list3=["nb1","nb2","nb3","nb4"]
a,*_,b = list3 #nb1 ['nb2', 'nb3'] nb4
print(a,_,b)
我们也可以从此得知一个重要结论:num这种解压出来的变量,不管数量是多少个,它的类型永远是list。如果你不需要这些变量,那你可以使用_ 来丢弃没用的变量
num,name = list2 就可以写成 _,name =list2
以上说的是大多是列表,当然字符串也是可以这么操作的。
代码语言:javascript复制slogan="!vwo50!"
_,*a,_ = slogan
print(a) #['v', 'w', 'o', '5', '0']
元组和集合同样可以使用:
代码语言:javascript复制turtle1 = (1,2,3,4,5)
print(type(turtle1))
a,*_ = turtle1
print(a,_) #1 [2, 3, 4, 5]
turtle1 = {1,2,3,4,5}
print(type(turtle1))
*_,b = turtle1
print(_,b) #[1, 2, 3, 4] 5
个人感觉这节内容的主要场景就是灵活接收变量和分解列表。如果您觉得这篇文章对你有帮助,不妨给我点个赞,这将是我继续分享优质内容的动力。