之前的文章说明了变量的三大组成部分,详细说明了变量名与变量值,但是对于赋值这一块介绍相对较少,今天就来对这一部分进行补充,除了egon老湿所讲之外,本喵还参阅了《python3-cookbook》中的内容,进行补充扩展。
一、基本赋值运算
= , += , -= , /= , %= , //=
这些基本的赋值运算不必多说,需要注意的是,“=”与前一个符号之间不能有空格。
二、交叉赋值
现在有两个变量x,y,分别对应3,4;现在需要将这两个变量的值进行交换,如何快速简明的实现呢?
x = 3
y = 4
x,y = y,x
这样,就可以轻松实现交叉赋值。但是,在复习时,我突发奇想,如果是三个呢?四个呢?交叉赋值还可以实现吗?来看实验↓
>>> x = "x"
y = "y"
z = "z"
x,y,z = y,z,x
x
'y'
y
'z'
z
'x'
看来3个变量没有问题,那7个呢?
>>> x = 1
y = 2
z = 3
m = 4
n = 5
a = 6
b = 7
x,y,z,m,n,a,b = b,a,n,m,z,y,x
x
7
y
6
z
5
m
4
n
3
a
2
b
1
看来交叉赋值在变量个数上没有限制,但是变量太多的情况下,交叉赋值可以,但没必要,因为一不小心就会出错。
三、解压赋值
重点说明一下解压赋值。当你有一个列表时,需要取出里面的值,按照传统方法该怎么取呢?
# 传统方法
list = [1.1,2.2,3.3,4.4]
x1 = list[0]
x2 = list[1]
x3 = list[2]
x4 = list[4]
按照“笨方法”,可以通过列表索引进行分别取值,但是解压赋值显得更加简单。
# 解压赋值
list = [1.1,2.2,3.3,4.4]
x1,x2,x3,x4 = list
可以看到只需要一行代码即可实现上面四行代码的功能。但是需要注意,这种方法变量名的数量需要和列表中值的个数相对应,否则就会报错;
如果不知道列表的个数,或者数量太多,该怎么赋值呢?这就需要用到星号表达式“*”,为了方便看到结果,下面就以交互式结果展示;
>>> list = [1,2,3,4,5,6]
x, *_, y = list
x
1
y
6
_
[2, 3, 4, 5]
可以看到,当解压赋值出现“*”时,python就会将中间咱们暂时不要的值,以列表的形式赋值给“_”,注意理解这句话,值的类型是列表,变量名是“_”,当然星号后面可以跟任何一个变量名,但是一般使用"_"或者ign(ignore)表示暂时不需要的值。
只有列表可以吗?
>>> test = (1,2,3,4,5)
x, *_,y = test
x
1
y
5
_
[2, 3, 4]
>>> dict = { "name":"zhangdada","age":15,"gender":"male","money":0}
x, *_, y = dict
x
'name'
y
'money'
_
['age', 'gender']
需要注意的是,字典在解压赋值取出的是key,而不是key:value的键值对。
>>> str = "woshizhangdada"
x, *_, y = str
x
'w'
y
'a'
_
['o', 's', 'h', 'i', 'z', 'h', 'a', 'n', 'g', 'd', 'a', 'd']
字符串居然也可以,而且是按照字符串的每一个字符进行解压赋值,通过这个方法,说不定以后可以玩出更多花样
>>> test1 = [1,2,3,("aa",3,0)]
x, *_,(*_,y) = test1
x
1
y
0
x, *ign,(*_,y) = test1
x
1
y
0
ign
[2, 3]
_
['aa', 3]
相较于前几种,各种类型嵌套解压赋值要稍微难理解一点,可以这样理解,相当于将列表的最后一个值,也就是元组取出来,再进行一次解压赋值;
***需要注意的是,通过星号表达式只能取两头的数据,可以是开头,也可以是结尾,还可以同时取开头与结尾,但是不能取中间的值;
手机扫一扫
移动阅读更方便
你可能感兴趣的文章