赋值trick

曾宣
• 阅读 1726

本文引用至:赋值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

看个总结:
赋值trick

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
Spring IOC 练习
练习题实验一|通过IOC容器创建对象,并为属性赋值实验二|通过Bean的类型从IOC中获取bean的实例实验三3.1使用构造器在IOC中创建bean3.2通过p名称空间为bean赋值实验四4.1正确的为各种属性赋值测试使用nu11值、引用类型赋值(引用其他bean、引用内部bean)集合类型赋值(Lis
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
JavaScript变量声明
const,let,var的区别和用法1.const——声明一个只读的常量,在声明的时候给其赋初值,之后不能再进行赋值。1consti0;2console.log(i);//有输出,为0如果对i进行再次赋值则会报错,TypeError:Assignmenttoconstantvariable
Wesley13 Wesley13
3年前
C#值类型赋值与引用类型的赋值
 在C中,数据类型大致可以分为两类,一类是值类型,一类是引用类型。初学者往往会被类型之间的相互赋值搞的很迷惑,尤其是引用类型变量的相互赋值。现在举2个例子,来一一说明。值类型变量的赋值: 值类型变量中保存的是实际数据,在赋值的时候只是把数据复制一份,然后赋给另一个变量。例子1:         intvar12;         
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
曾宣
曾宣
Lv1
仍怜故乡水,万里送行舟。
文章
4
粉丝
0
获赞
0