赋值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

不过,这里需要注意下面

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

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

变量交换

直接看demo吧:

>>> a[1]>>> b2>>> 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, 赋值, 解包, 元组

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部