Python函数式编程:返回函数与匿名函数

共 2205字,需浏览 5分钟

 ·

2022-07-05 10:33

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达


接着上次的Python函数式编程,小编继续往下学习了函数式编程的剩下的一些内容。今天的内容包括返回函数和匿名函数。顺便说一句,Python真的比R难学啊,对于没有计算机学科基础的同学来说,自学Python确实挺头疼的。

>>>>

返回函数

所谓返回函数,顾名思义,就是把函数作为返回值。高阶函数除了可以将函数作为参数之外,还可以将函数作为结果进行返回。下面来实现一个可变参数的连乘,求积函数可定义为:

def calc_fac(*args):
  fx = 0
  for n in args:
       fx = fx * n
return fx

很多时候当求积函数定义好后我们并不需要立即求积,而是会根据后面的计算再行调用。这时,我们就可以先不返回函数的结果,而是将函数本身返回,如下可见:

def lazy_fac(*args):
   def fac():
     fx = 0
  for n in args:
        fx = fx * n
    return fx
return fac

重新定义求积函数后,当我们调用lazy_fac()时,返回的就不是求积的结果啦,而是求积函数:

>>> a=lazy_fac(1,2,3,4)
>>> a
<function lazy_fac.<locals>.fac at 0x002a5dr42>

而当调用函数 a 时,求积过程才被执行:

>>> a()
24

此例中,我们在函数lazy_fac中又定义了函数fac,fac可称做内部函数,而lazy_fac为外部函数。内部函数fac可以引用外部函数的的参数和局部变量。参数和变量都保存在我们最后返回的内部函数fac中。这种程序结构在Python上我们称之为闭包

在闭包结构中,函数作为结果返回时,函数过程并没有被立刻执行,而是等我们调用 a( )后才执行。

总之,在函数式编程里,函数除了可以返回一个计算结果之外,也可以返回一个未执行的函数。当返回函数时,始终牢记该函数并未被执行,返回函数中尽量不要引入循环变量等可能引起变化的变量。


>>>>

匿名函数

当我们在传入函数时或者代码结构过于复杂时,我们可以通过匿名函数来代替显式的函数定义。此时,匿名函数会大大简化代码结构,可以使之更为精炼。

以之前介绍的 map 函数为例来计算 x看看匿名函数的功能:

>>> list(map(lambda x: x * x * x, [1, 2, 3]))
[1, 8, 27]

对比可以看出,匿名函数lambda x : x*x*x 就相当于:

def f(x):
 return x * x * x

lambda作为匿名函数的关键字,冒号前面的 x 表示匿名函数的参数。匿名函数只能有一个表达式,无需像定义函数那样写 return。因为匿名函数没有函数名,在使用过程中就不需要担心函数名的冲突。匿名函数作为一个函数对象,也符合向变量进行赋值的规则:

>>> fx = lambda x: x * x * x
>>> fx
<function <lambda> at 0x101c6ef28>
>>> f(4)
64

同样,匿名函数作为一个函数也可以被被当成返回函数:

def f(x):
 return lambda: x * x * x

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇




下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报