s = “SPAM”
a,b = s[:3],s[2:]
print(a,b )
运行结果:
SPA AM
2.小技巧二
除了用切片的方式,我们还可以用其他的方式给a和b赋值:
s = “SPAM”
(a,b),c = s[:2],s[2:]
print(a,b,c )
运行结果:
S P AM
这种操作相当于在大元组((a,b),c)里面分了一个小元组(a,b),然后对a,b进行赋值。
3.小技巧三
举例:用赋值语句把列表[1,2,3,4,5]进行每次减少1个元素并输出列表。
l = [1,2,3,4,5]
while l :
l = l[1:]
print(l)
运行结果:
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
4.案例
现有一个二维列表[[[1,2,3],[4,5,6],[7,8,9]] ,如何用序列赋值的方法进行输出列表里的每一个元素?方法如下:
s = [[1,2,3],[4,5,6],[7,8,9]]
for (a,b,c) in s:
print(a,b,c)
运行结果:
1 2 3
4 5 6
7 8 9
(a,b,c)和 s 是不同类型的序列类型,通过序列赋值的方法也能够实现。
三、拓展的序列解包
前面的常见赋值语句表里面我们讲过拓展的序列解包操作:
| 方式 | 解释 |
| — | — |
| a,*b = “hello” | 扩展的序列解包 |
那么它该如何使用?首先我们应该知道 *b 是有何用:
*b:获取分配完之后所剩的数据,封装成列表进行输出
举例:
a,*b = “abcdefg”
print(a)
print(b)
运行结果:
a
[‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]
通过这个例子可以看出,a被第一个元素赋值,剩下的都给了b,并且剩下的元素都被封装成了列表。
1.小技巧一
既然上面我们讲了
a,*b = “字符串”
那么如果我们多加一个元素来赋值呢?又会如何?
a,*b,c = “abcdefg”
print(a)
print(b)
print©
运行结果:
a
[‘b’, ‘c’, ‘d’, ‘e’, ‘f’]
g
可以看出来的是,还真给c留出来了一个对象并赋值,这个方法可以灵活运用。
2.小技巧二
如果说我们对调一下位置:
*b,a = “abcdefg”
print(a,b)
运行结果:
g [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]
可以看出,字符串的最后一个元素g还是赋值给了a,所以对调位置也是可以的,此时的a将会从后面取。
3.小技巧三
如果我们只给3个元素,但有4个元素要赋值,那么 * b 能拿到值吗?
a,c,*b,d = “abc”
print(a,b,c,d)
运行结果:
a [] b c
结果b是1个空列表,因为字符串只有三个字符,不够给b,同样的,不管你怎么交换 * b 的位置,结果都一样,也就是说,会优先给其他元素赋值, b 的优先级最低,有时候会拿不到值*。
4.注意点:*b 不能直接赋值
有一个点我们需要注意一下,*b 是不能直接赋值的:
前面被赋值的对象只能是列表或者元组的序列类型,而 *b 单独存在时是不属于这种类型的。
这个时候我们如何改正它?很简单,把前面变成元组或者列表就可以了:
哪怕是加个逗号,*b都可以变成元组。
5.案例
那么拓展的序列解包我们也来一个案例,我们还是用上面讲过的把列表[1,2,3,4,5]逐次减少1个元素并输出列表,这次我们用序列解包的方法来做:
l = [1,2,3,4,5]
while l:
a,*l = l
print(l)
运行结果:
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
那么前面高级赋值语句内容我们还讲过一个for循环输出二维列表的例子,那么for循环能不能也用带 * 的参数来进行赋值呢?答案也是可以的: