Python应用——多变量的灵活处理
本文始发于个人公众号:TechFlow,原创不易,求个关注
我们都知道Python是一个非常灵活的语言,以至于如果它不是你的第一门语言,你会发现它总能给你各种各样的惊喜,让你忍不住惊叹:woc,还有这种操作。尤其我在系统地学习Python之前是Java后端出身,所以每一阶段几乎都会让我觉得打开了新世界的大门。今天就和大家介绍一个最基础,非常好用,但是很多人不知道的操作。
解压变量
我们都知道,Python允许进行多个变量的赋值操作,比如著名的交换两个元素,如果是在C++或者Java语言当中,如果不通过函数实现,必须要引入第三个变量,比如:
# swap a, b
c = a
a = b
b = c
我们要交换a和b必须要引入c,这是因为当我们赋值b给a的时候,a原本的值会丢失,所以我们必须要先”缓存“下来。但是由于Python支持多变量赋值的操作,所以大可不必引入其他变量就可以完成,所以交换两个元素在Python当中只有一行就可以搞定:
a, b = b, a
Python的解释器会直接计算后边的值然后覆盖左边,赋值是同时进行的,所以不需要引入其他变量,而且看起来也非常geek。
除此之外,Python还支持tuple和list的解压。
举个例子,假设我们有一个二元数组:[1, 2],我们希望用两个变量分别获取它的第0位和第一位,我们当然可以写成这样:
l = [1, 2]
a, b = l[0], l[1]
其实并不用这么麻烦,因为当Python检测到等号左边是多个变量,右边是list或者是tuple之后,会自动执行list和tuple的解压,将它依次赋值给对应的元素,所以上面的代码可以简化成:
l = [1, 2]
a, b = l
那如果l是一个二维数组,我们希望遍历它呢?同样可以在循环当中使用:
l = [[1, 2], [3, 4], [5, 6]]
for i, j in l:
print(i, j)
即使是在变量的组合当中也可以生效:
a, b, c = 1, 3, (4, 5)
print(c)
当我们执行这段代码,屏幕上会输出什么呢?是会报错吗?还是会解压(4, 5)这个tuple然后将4赋值给c呢?
都不对,输出的结果是(4, 5),也就是说Python发现变量数量对不上之后,会自动将tuple当做一个整体进行赋值。不但如此,即使是下面这种情况,Python也能自动识别:
a, b, (c, d), e = 1, 3, (4, 5), 7
print(c, d)
在上面的赋值当中,既有tuple又有普通元素,并且我们的变量也组合成了tuple,这时Python同样会识别出(4, 5)应该赋值给(c, d)这个整体,也就是说4和5分别赋值给c和d。
缺省元素
在有的时候,我们在获取元素的时候,源数据当中有我们不需要的字段。虽然Python自动解压非常方便,但是我们还是要为我们不需要的数据设置变量。在一些情况下这会导致内存的浪费,并且这也不符合我们编程的规范,即所有变量都应该派上用场。为了解决这个问题,Python提供缺省元素的方法。我们可以使用_来代表一个缺省值,_对应的数据不会被存储下来,只是为了方便我们”凑齐“元素。
举个例子,还用上面的例子举例,假设源数据的格式是这样:1, 3, (4, 5), 7,但是我们只需要中间的元组,我们就可以这样去接收:
_, _, (c, d), _ = 1, 3, (4, 5), 7
再比如,当我们遍历dict的时候,有可能我们并不关注dict的key,只希望获得它的value,这个时候也可以使用缺省符号:
a = {}
for _, v in a.items():
print(v)
压缩变量
既然变量可以解压,那么自然也可以压缩。想象一个场景,比如有一批衡量工厂零件的数据,这个数据当中除了零件的尺寸之外还包含了零件的名称,生产日期和工厂名称等等其他的属性。假设我们当下希望解析这份数据,并且将零件的尺寸用数组存储,这个时候应该怎么办呢?
比如,零件的数据的规格长这样:wheel, factory1, 3, 4, 5, 6, 2020-02-02
Python同样针对这个问题提供了解决方法,就是变量压缩符*,针对上面那个问题,我们可以写成:
data = ['wheel', 'factory1', 3, 4, 5, 6, '2020-02-02']
name, factory, *inch, date = data
print(inch)
最后我们打印出来的inch是[3, 4, 5, 6],也就是说通过使用*,我们成功地将中间表示零件尺寸的数据赋值进了一个数组当中。这个操作非常重要,因为有可能不同零件尺寸的数量是不同的,如果我们自己写解析的话就很难处理这个问题。而使用Python当中的 *操作符,我们可以很好地解决这个问题。
联合使用
到这里,我们介绍了缺省符号的用法,介绍了压缩符号的用法,问题来了,我们能不能将这两个符号组合使用,获取数据当中任意个缺省值呢?
当然是可以的,还是刚才的问题,假设我们现在不关心零件的尺寸,想要过滤掉它们,我们只要对上面的代码稍作改动即可:
data = ['wheel', 'factory1', 3, 4, 5, 6, '2020-02-02']
name, factory, *_, date = data
如此我们就过滤掉了中间若干个尺寸信息,仅仅保留了头尾其他的信息。
其他用途
到这里还没结束,不知道大家在看到 * 这个操作符号的时候有没有什么联想,如果稍稍了解过Python的话,应该会想起Python当中,如果我们想让一个函数接收任何参数的话,我们可以写成:
def func(*args, **kw):
pass
其中args其实代表一个数组,kw代表一个dict,这些我们都是知道的。但是前面的 * 和 ** 呢,又代表什么呢?
代表解压数组,*自然就代表解压dict。我们来看个例子:
a = [1, 3, 5]
print(a)
print(*a)
请问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实现多变量线性回归(Linear Regression with Multiple Variables)
本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记 现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为( x1,x2,..., ...
- Python中排序的灵活使用
Python中列表按指定标准排序实例 概述 本题需要先输入机器的数目和任务的数目. 在接下来的n行中每行分别包含机器的最大执行时间和机器所能执行任务的最大强度. 在接下来的n行中每行分别包含任务执行时 ...
- Python lambda 多变量
>> x = list(map(lambda x, y: (x>3, y>0), (1,2,3,4,5), (0,1,2,3,4)))>>> x[(False ...
- [Python] 利用Django进行Web开发系列(一)
1 写在前面 在没有接触互联网这个行业的时候,我就一直很好奇网站是怎么构建的.现在虽然从事互联网相关的工作,但是也一直没有接触过Web开发之类的东西,但是兴趣终归还是要有的,而且是需要自己动手去实践的 ...
- 【转】windows和linux中搭建python集成开发环境IDE
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- Python - 001 - 类与实例间属性的理解
Python是个很灵活的语言,光看它的类和实例间属性的访问机制就可以看出这一点,不过这一点还真的不好理解,做了些测试之后我的理解是这样的: 实例在访问class属性时,先检索自己的names, 如果有 ...
- 说说这篇「我为什么从python转向go
作者 CMGS2015.05.17 15:47* 写了7891字,被143人关注,获得了97个喜欢 说说这篇「我为什么从python转向go」 字数3748 阅读24227 评论21 喜欢81 恩看了 ...
- Python之什么是函数
我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = 73.1 ...
- python基础——切片
python基础——切片 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', ...
随机推荐
- 7个效果震憾的HTML5应用组件
在HTML5的世界里,任何文本.图像都可以变得令人难以想象,很多HTML5应用也都已经随着浏览器的升级而变得运行飞速,而且兼容性也越来越好.下面为大家介绍7款效果震憾的HTML5应用组件,HTML5是 ...
- JVM系列七(JIT 即时编译器).
一.概述 即时编译器(Just In Time Compiler),也称为 JIT 编译器,它的主要工作是把热点代码编译成与本地平台相关的机器码,并进行各种层次的优化,从而提高代码执行的效率. 那么什 ...
- ST表竞赛模板
void RMQ_init(){//ST表的创建模板 ;i<n;i++) d[i][]=mo[i]; ;(<<j)<=n;j++) ;i+(<<j)-<n;i ...
- 通过核心API启动单个或多个scrapy爬虫
1. 可以使用API从脚本运行Scrapy,而不是运行Scrapy的典型方法scrapy crawl:Scrapy是基于Twisted异步网络库构建的,因此需要在Twisted容器内运行它,可以通过两 ...
- bootstrap4popper.js报错Uncaught ReferenceError
这是因为bootstrap4需要umd版的popper.js <script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/pop ...
- vs推送git失败,修改git下config的Log
一开始写完程序套推送到Git中,然后就来了一下,下面的异常: 异常1 发布到远程存储库时遇到错误: Git failed with a fatal error. fatal: HttpRequestE ...
- DirectX11 Windows Windows SDK--28 计算着色器:波浪(水波)
前言 有关计算着色器的基础其实并不是很多.接下来继续讲解如何使用计算着色器实现水波效果,即龙书中所实现的水波.但是光看代码可是完全看不出来是在做什么的.个人根据书中所给的参考书籍找到了对应的实现原理, ...
- Redis 使用总结
1. 避免大key 危害: 数据热点问题,集群模式在slot分片均匀情况下,会出现数据和查询倾斜情况,部分有大key的Redis节点占用内存多,QPS高 慢查询问题,服务超时 网卡带宽压力,极端情况下 ...
- [bzoj2152] [洛谷P2634] 聪聪可可
Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好 ...
- qt creator源码全方面分析(0)
本人主攻C++和Qt. 上两天刚研究完Qt install framework(IFW)应用程序安装框架. google没发现有正儿八经的官方文档的翻译,我就进行了翻译哈!! 系列文章具体见:http ...