浅谈Python函数式编程的返回函数与匿名函数

作者:程序员老华 时间:2021-02-22 13:40:36 

返回函数

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

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 函数为例来计算 x3 看看匿名函数的功能:

>>> 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

来源:https://blog.csdn.net/m0_72557783/article/details/125666019

标签:Python,函数,返回,匿名
0
投稿

猜你喜欢

  • Python跳出循环语句continue与break的区别

    2023-10-19 11:04:19
  • python 如何比较两集合的大小关系

    2023-10-14 01:37:06
  • Dreamweaver 4.0使用技巧集锦

    2007-11-08 12:47:00
  • 在VS2017中用C#调用python脚本的实现

    2021-09-19 00:59:06
  • Python数据分析之Python和Selenium爬取BOSS直聘岗位

    2021-04-27 08:53:19
  • python 实现提取PPT中所有的文字

    2023-05-01 04:21:35
  • Python程序设计入门(4)模块和包

    2023-06-18 11:37:36
  • thinkphp微信开发(消息加密解密)

    2023-11-21 06:08:43
  • 网站中视觉元素的设计

    2008-04-27 20:47:00
  • 浅谈Python数据类型之间的转换

    2023-12-06 03:58:31
  • 使用pytorch进行张量计算、自动求导和神经网络构建功能

    2022-08-18 11:50:48
  • django 将model转换为字典的方法示例

    2022-09-16 14:03:09
  • Python模块glob函数示例详解教程

    2023-10-27 15:49:36
  • Django 源码WSGI剖析过程详解

    2023-09-14 22:19:58
  • Pycharm激活码激活两种快速方式(附最新激活码和插件)

    2023-05-17 12:07:07
  • Python Spyder 调出缩进对齐线的操作

    2023-07-17 00:56:04
  • JavaScript 组件之旅(二):编码实现和算法

    2009-10-09 14:24:00
  • 详解python基础之while循环及if判断

    2023-01-14 20:54:39
  • asp如何用JMail同时给多人发信?

    2010-06-12 12:52:00
  • Python从使用线程到使用async/await的深入讲解

    2021-07-26 10:56:11
  • asp之家 网络编程 m.aspxhome.com