零基础学python-10.1 序列赋值高级应用

赋值语句的基本操作在前面的章节已经说到过,现在我们来说说赋值到高级应用

第一节说的是序列赋值

>>> a= 1
>>> b=2
>>> c,d=a,b
>>> c,d
(1, 2)
>>> [c,d]=[a,b]
>>> c
1
>>> c,d
(1, 2)
>>> 

上面是一个简单的序列分解赋值语句,注意:在第三行c,d=a,b其实是组成一个元组,右边的值依次赋值给左边的变量

>>> a= 1
>>> b=2
>>> b,a=a,b
>>> a
2
>>> b
1
>>> a,b
(2, 1)
>>> 
上面的这种元组使用技巧是经常使用的

而且,上面的技巧不单适合整个元组,而且还适合部分的赋值

>>> (a,b,c)=(1,2,3)
>>> a,b
(1, 2)
>>> b,c
(2, 3)
>>> a,b,c
(1, 2, 3)
>>> a
1
>>> 

高级序列赋值语句模式

我们可以使用=将两侧混合相匹配,不过右边元素的数目必须跟左边的一致

>>> a,b,c,d='abcd'
>>> a,b,c,d
('a', 'b', 'c', 'd')
>>> a,b,c='abcd'
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    a,b,c='abcd'
ValueError: too many values to unpack (expected 3)
>>> 

>>> a,b,c=string[0],string[1],string[2]
>>> a,b,c
('a', 'b', 'c')
>>> a,b,c=list(string[:2])+[string[2:]]
>>> a,b,c
('a', 'b', 'cd')
>>> 

>>> ((a,b),c)=('ab','cd')
>>> a,b,c
('a', 'b', 'cd')
>>> 

序列扩展包

在上面我们看到,左右两侧的数目必须一致,但是也是有其他办法打破这个的

我们可以使用*来作为通配符,代表余下的数据项

>>> a,*b='abcd'
>>> a,b
('a', ['b', 'c', 'd'])
>>> 
上面的a只是代表第一项,余下的都赋值给b

同理:

>>> *a,b='abcd'
>>> a,b
(['a', 'b', 'c'], 'd')
>>> 

>>> *a,b,c='abcd'
>>> a,b,c
(['a', 'b'], 'c', 'd')
>>> 
这个序列扩展包对于所有序列类型都有效

>>> a,*b=(1,2,3,4)
>>> a,b
(1, [2, 3, 4])
>>> a,*b=[1,2,3,4]
>>> a,b
(1, [2, 3, 4])
>>> 

需要注意的是边界情况,出现这个情况,python自动给超出边界的项赋值空

>>> a,b,c,d,*e=(1,2,3,4)
>>> a,b,c,d,e
(1, 2, 3, 4, [])
>>> a,b,c,d,*e='abcd'
>>> a,b,c,d,e
('a', 'b', 'c', 'd', [])
>>> 

还需要注意的是,*符号只能存在一个,而且只有一个变量是不能使用*
>>> a,*b,*c,d,*e='abcd'
SyntaxError: two starred expressions in assignment
>>> a,b,c,d,e='abcd'
Traceback (most recent call last):
  File "<pyshell#46>", line 1, in <module>
    a,b,c,d,e='abcd'
ValueError: need more than 4 values to unpack
>>> *a='abcd'
SyntaxError: starred assignment target must be in a list or tuple
>>> 


如果一个变量需要加*,那么必须在变量后面加上逗号,代表后面也跟着一个空变量

>>> *a,='abcd'
>>> a
['a', 'b', 'c', 'd']
>>> 

就说到这里,谢谢大家

------------------------------------------------------------------

点击跳转零基础学python-目录






版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/raylee2007/p/4774465.html