python 二维数组赋值_Python中多个变量的灵活处理
我们都知道Python是一个非常灵活的语言,以至于如果它不是你的第一门语言,你会发现它总能给你各种各样的惊喜,让你忍不住惊叹:woc,还有这种操作。尤其我在系统地学习Python之前是Java后端出身,所以每一阶段几乎都会让我觉得打开了新世界的大门。今天就和大家介绍一个最基础,非常好用,但是很多人不知道的操作。
解压变量
我们都知道,Python允许进行多个变量的赋值操作,比如著名的交换两个元素,如果是在C++或者Java语言当中,如果不通过函数实现,必须要引入第三个变量,比如:
我们要交换a和b必须要引入c,这是因为当我们赋值b给a的时候,a原本的值会丢失,所以我们必须要先”缓存“下来。但是由于Python支持多变量赋值的操作,所以大可不必引入其他变量就可以完成,所以交换两个元素在Python当中只有一行就可以搞定:
Python的解释器会直接计算后边的值然后覆盖左边,赋值是同时进行的,所以不需要引入其他变量,而且看起来也非常geek。
除此之外,Python还支持tuple和list的解压。
举个例子,假设我们有一个二元数组:[1, 2],我们希望用两个变量分别获取它的第0位和第一位,我们当然可以写成这样:
其实并不用这么麻烦,因为当Python检测到等号左边是多个变量,右边是list或者是tuple之后,会自动执行list和tuple的解压,将它依次赋值给对应的元素,所以上面的代码可以简化成:
那如果l是一个二维数组,我们希望遍历它呢?同样可以在循环当中使用:
即使是在变量的组合当中也可以生效:
当我们执行这段代码,屏幕上会输出什么呢?是会报错吗?还是会解压(4, 5)这个tuple然后将4赋值给c呢?
都不对,输出的结果是(4, 5),也就是说Python发现变量数量对不上之后,会自动将tuple当做一个整体进行赋值。不但如此,即使是下面这种情况,Python也能自动识别:
在上面的赋值当中,既有tuple又有普通元素,并且我们的变量也组合成了tuple,这时Python同样会识别出(4, 5)应该赋值给(c, d)这个整体,也就是说4和5分别赋值给c和d。
缺省元素
在有的时候,我们在获取元素的时候,源数据当中有我们不需要的字段。虽然Python自动解压非常方便,但是我们还是要为我们不需要的数据设置变量。在一些情况下这会导致内存的浪费,并且这也不符合我们编程的规范,即所有变量都应该派上用场。为了解决这个问题,Python提供缺省元素的方法。我们可以使用_来代表一个缺省值,_对应的数据不会被存储下来,只是为了方便我们”凑齐“元素。
举个例子,还用上面的例子举例,假设源数据的格式是这样:1, 3, (4, 5), 7,但是我们只需要中间的元组,我们就可以这样去接收:
再比如,当我们遍历dict的时候,有可能我们并不关注dict的key,只希望获得它的value,这个时候也可以使用缺省符号:
压缩变量
既然变量可以解压,那么自然也可以压缩。想象一个场景,比如有一批衡量工厂零件的数据,这个数据当中除了零件的尺寸之外还包含了零件的名称,生产日期和工厂名称等等其他的属性。假设我们当下希望解析这份数据,并且将零件的尺寸用数组存储,这个时候应该怎么办呢?
比如,零件的数据的规格长这样:
wheel, factory1, 3, 4, 5, 6, 2020-02-02
Python同样针对这个问题提供了解决方法,就是变量压缩符*,针对上面那个问题,我们可以写成:
最后我们打印出来的inch是[3, 4, 5, 6],也就是说通过使用*,我们成功地将中间表示零件尺寸的数据赋值进了一个数组当中。这个操作非常重要,因为有可能不同零件尺寸的数量是不同的,如果我们自己写解析的话就很难处理这个问题。而使用Python当中的 *操作符,我们可以很好地解决这个问题。
联合使用
到这里,我们介绍了缺省符号的用法,介绍了压缩符号的用法,问题来了,我们能不能将这两个符号组合使用,获取数据当中任意个缺省值呢?
当然是可以的,还是刚才的问题,假设我们现在不关心零件的尺寸,想要过滤掉它们,我们只要对上面的代码稍作改动即可:
如此我们就过滤掉了中间若干个尺寸信息,仅仅保留了头尾其他的信息。
其他用途
到这里还没结束,不知道大家在看到 * 这个操作符号的时候有没有什么联想,如果稍稍了解过Python的话,应该会想起Python当中,如果我们想让一个函数接收任何参数的话,我们可以写成:
其中args其实代表一个数组,kw代表一个dict,这些我们都是知道的。但是前面的 * 和 ** 呢,又代表什么呢?
*代表解压数组,**自然就代表解压dict。我们来看个例子:
请问print(a)和print(*a)有什么区别?如果你试一下就会发现,直接打印a,出来的结果是[1, 3, 5],如果你打印 *a,得到的结果是1, 3, 5。也就是说前者是将a当成一个数组输出,是一个变量,后者则是将a解压了,当成了3个变量输出。那么同样的道理,**kw,也是将作为dict的kw解压,以key: value的形式展开。不过如果你直接调用 **kw会得到一个报错,这个操作只能在函数传递参数的时候使用。
所以到这里,我们就明白了,*args和**kw为什么能够代表所有参数了。因为前者代表了直接传递的必选参数,后者呢,代表提供了默认值的默认参数。这也是为什么Python限定了默认参数必须放在必选参数后面的原因,一方面是为了消除歧义,另一方面也是为了能够用*args, **kw来统一表示。
今天的内容虽然简单,但是在实际代码当中经常用到,用得好的话可以大大简化我们coding的难度以及代码的美观程度,因此如果对Python感兴趣的同学,非常推荐一学。
今天的文章就是这些,如果觉得有所收获,请顺手点个关注或者转发吧,你们的举手之劳对我来说很重要。
“
参考资料 Python cookbook 第三版
维基百科
python 二维数组赋值_Python中多个变量的灵活处理相关推荐
- python 二维数组赋值_python日常注意小知识集锦
python日常注意小知识集锦 @toc sort()和sorted() 以列表结果为例 - sort()没有结果返回,但对列表进行了排序(列表本身被改变) - sorted(),全局函数,有结果返回 ...
- python给矩阵赋值_解决Python二维数组赋值问题
解决Python二维数组赋值问题 当我们采用s=[[0]*3]*2初始化一个数组,然后对s[0][0]进行赋值,改变的是第一列所有的值.因为用s = [[0]*3]*2 初始化数组,他表示的是指向这个 ...
- python二维数组表示_python中二维数组中的数如何表达
python二维数组如何挑选出一定范围的数值? 比如说有一个二维数组 13.1 13.2 13.3 13.4 15.5 15.0 45.2 22.3 22.3 3 [j for i in a for ...
- python二维数组操作_Python二维数组应用与操作
课课家将会在这里为大家详细的介绍一下Python二维数组的相关应用方法以及定义方式,相信朋友们可以从中学习到更多的知识. Python数组的应用中在实际编程中是一个非常重要的应用技术,作为Python ...
- python 二维数组 长度_Python创建二维数组的正确姿势
↑↑↑点击上方"蓝字",关注"极客猴" 如果你喜欢极客猴,可以把我置顶或加为星标 题图:by watercolor.illustrations from Ins ...
- python二维数组求和_Python如何对二维数组求和
Python对二维数组求和的方法:首先定义好一个二维数组:然后使用map函数对数组里每一个元素进行sum操作即可对二维数组求和. 关于二维数组求和的几种方法: a = [[1,2],[3,4],[5, ...
- python 二维列表切片_Python中mutable与immutable和二维列表的初始化问题
初始化一个shape为(3,3)的二维列表,正确的写法是这样的: 但是,如果写成这样: a = [[None] * 3] * 3print(a) # 输出 : [[None, None, None], ...
- Python二维数组赋值问题
当我们采用s=[[0]*3]*2初始化一个数组,然后对s[0][0]进行赋值,改变的是第一列所有的值.因为用s = [[0]*3]*2 初始化数组,他表示的是指向这个列表的引用,所以当你修改一个值的时 ...
- python二维列表添加_Python二维数组
二维数组是数组中的数组. 它是一个数组的数组. 在这种类型的数组中,数据元素的位置由两个索引,而不是一个索引来引用. 所以它表示了一个包含行和列的数据的表. 在下面的二维数组的例子中,每个数组元素本身 ...
最新文章
- 单tomcat多实例的实现
- 还在用Synchronized?Atomic你了解不?
- nefu 753 n!末尾有多少个0
- c++11-std::functionbind
- JavaScript中的坐标
- SpringBoot_日志-日志框架分类和选择
- node.js 执行php,node.js - 如何利用php执行nodejs文件
- 管理用户和PROFILE——用户方案和profile
- HttpClient中异步方法的同步调用
- 「一本通 6.5 练习 3」迷路
- Java Web 开发的目录结构
- gdb 7.X 下载编译(aarch64)
- 实用技术会议通知:我知道你不会来,可是我不说是我的错
- 信息和信息技术的概念,发展和应用
- CAD布局图纸导出为模型图纸
- mysql获取当前时间+1天_mysql获取当前时间,前一天,后一天
- 只要方向正确,路远不是事
- 置换检验 配对秩和检验
- 机器学习十大算法---3. SVM
- Android实现播放音乐列表
热门文章
- 锂电池放空后充不进电_锂电池过度放电后充不进电怎么办
- mysql 设置某个字段等于某个字段_学习记录-第十八天(李玉婷MySQL基础 第12天)...
- JavaScript基础学习之运算符(三)
- 用姓名字段统计人数_2019年度全国各地姓名报告分析汇总(全国、深圳、佛山、杭州)...
- Mybatis-sql语句的抽取
- Intellij IDEA + Maven——jar项目改成war项目相互转换
- 七种垃圾收集器和垃圾回收、分代收集、GCROOTS相关概念、GC如何判断一个对象可以被回收
- MySQL乐观锁、共享锁、排他锁、行锁、表锁区别和使用方法
- IOS中四种json解析效率比较
- dag见证服务器是虚拟ip吗,exchange后端和DAG搭建.docx