原创:王稳钺
资料来源:高民权
本文以实际问题驱动,主要介绍三个有助于提高Python编程能力的技能点。
1. Python3.10最新特性
首先第一个问题见下图,这个问题经常出现在计算机视觉,尤其是OCR和目标识别等相关的领域。
经过抽象,其实所需要处理的是两种固定的模式,即”嵌套+其他“和“非嵌套+其他”。解决方法比较简单,可以采用递归来解决。
假设现在有另外一个问题——flatten json,这在写API时会经常遇见。服务器端收到的json它可能是各种各样的,例如下图。如果想将‘Car’、‘Red’、‘off’等取出要如何做呢?
如果使用if-else去解决,会非常的复杂。那这个问题和前面的问题有没有什么相似之处呢?其实这两个问题本质上都是在进行一种模式上的匹配,它们的输入都满足某种模式,在此种模式中进行一些处理。Python3.10就出现了一种新的语法,来解决这类问题,具体使用见下图。
了解了这种语法之后,可以将第一个问题的代码修改的更加“优雅”,见下图。
利用flatten可以,可以尝试解决一个非常非常复杂的问题。在整个人工智能的发展历程上,有一个机器人叫做Eliza,它其实是历史上第一个被商用的人工智能程序,它所采用的是最经典的模式匹配。将输入的话通过模式匹配,输出后面的内容,如果了解过相关的内容就会知道这个问题其实是非常复杂的。
解决的具体代码如下。
下面的程序中利用了Python的一种高级用法,这不是3.10才有的,让计算机自己来生成一段程序并执行,这是C,C++等做不到的。
程序运行结果如下。
2. Python面向函数编程
什么叫做面向?面向是计算机程序语言理论里边一个非常非常基本的概念。如果某一个东西可以做变量,可以做参数,可以做返回值,就说是面向这个东西的。这就解释了为什么C++是面向对象的,而C语言不是。C语言中类是不能做返回值,不能做参数的,必须得返回指针。而在C++中,可以直接把类作为一个变量,作为一个参数。而所谓的面向函数其实就指的是函数可以作为一个返回值,函数可以作为一个参数,函数可以作为一个变量。下面举一个简单例子(装饰器)。
首先定义两个函数。如果想要得到函数的运行时间,可以采用time来计算,但如果有几十个函数都需要计算时间,将会非常麻烦。此时就可以利用下面的方法来实现。
函数作为一个参数值传入,同时返回值也是一个函数,这是典型的面相函数的使用。为了简化,可以使用@,如下图 。
再举另外一个例子,将服务器的开发抽象成一个简单的例子。
很多人写出来的程序可能是这样的,很麻烦。
其实可以这样做。
这样做的好处是如果外面有新的函数,不需要对新的函数有任何的修改,只需要在map中加入一行就可以了。这是面相函数编程才能实现的。
3. Python广播加速机制
对于传统的向量操作、矩阵操作,第一反应是用循环或者列表解析来做。但是其实在numpy、panas、torch中所有的矩阵和向量都是可以直接进行相乘、相加的,并且很多操作不需要利用循环。下面举一个简单的例子。
如果想要取出每一行第一个元素,可以采用循环完成。
更简单的方法可以不用循环。
如果要实现对于矩阵每一行的元素都加上这一行的第一个值,如果用循环完成比较麻烦的。如果利用广播,一句话就可以实现,并且在时间上显然会比用循环快很多。
掌握Python高级编程技能,对于提高编程能力,更快更好的处理问题都是非常有必要的。