赋值trick

本文引用至:赋值trick

python 让世人震惊的就是他的灵活, 他的灵活不仅表现在他各种各样的包, 更表现在他深层次的语法当中.
比如, 赋值魔法就是一个很nice的trick.

sequence unpacking

序列解包, 在py中,用途真的很广.
当在等号一边使用多个值时, 会默认将值转化为元组:

>>> tup = 1,2,3,
>>> tup
(1, 2, 3)

如果你两边都对应相同的值的话, 就会发生sequence unpacking. 意思就是,再将元组给拆分开, 进行赋值.

>>> a,b,c = 1,2,3
>>> print('''
...     a is {0}
...     b is {1}
...     c is {2}'''.format(a,b,c))

    a is 1
    b is 2
    c is 3

另外, 还可以进行元组的嵌套. 比如:

>>> (a,b),c = (1,2),3
// 结果和上面一致

该种赋值叫做序列解包, 序列有两种,一种为tuple 一种为list. 那list能不能行呢?
试一试

>>> a,b = [1,2]

没有报错, 说明对于list而言,这种赋值也是可行的.
另外, 在python3.x中,还提出一种extended unpacking(拓展解包).
他的作用就是使用*来收集剩下的内容,并且转换为list. 因为上面的序列解包, 等号两边必须顺序都是对应的. 所以, 如果你只想获得前两个, 那么拓展解包就很合适了.

>>> *a,b = 1,2
// a:[1], b:2

不过,这里需要注意下面

  • 你不能单独使用*: 比如>>> *a = 1,2 这是会报错的. 因为解包的要求,两边必须是元组,你进行单个赋值,这样的结果估计就go die了.
    所以,你可以这样使用:*a,=1,2 这样就没问题了. 先将*a转变为tuple, 然后再进行解包.

那, 这到底有什么用呢?
除了上面所说的多变量赋值外, 解包还可以用来 进行变量的交换, 直接获取函数的返回值.

变量交换

直接看demo吧:

>>> a
[1]
>>> b
2
>>> a,b = b,a

只要交换位置即可, 编译器内部会帮我们自动进行中间量的添加.

获取函数返回值

这个就不用多说了. 就相当于变量的直接复制.比如, dict中的popitem方法, 他会随机删除掉一个key/value pair. 所以,如果你想获取删除的值就可以这样写:

>>> new_dict
{1: 0, 2: 0, 3: 0, 4: 0}
>>> key,value = new_dict.popitem()

chained assignment

上面的解包代表的是一一映射的关系, 在py中,我们还可以使用它的链式赋值,相当于一对多的关系.

>>> a = b = 2

看个总结:

你可能感兴趣的:(python3.x)