浅谈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
猜你喜欢
- 在最近一个项目中,表单验证需要对时间的起止范围进行判断:结束时间需大于或等于开始时间。即:结束年须大于起始年;如果相等,则比较起始月与结束月
- 一.CSRF简介CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站
- 一.权限表mysql数据库中的3个权限表:user 、db、 host权限表的存取过程是:1)先从user表中的host、 user、 pa
- 本文简单总结了一下Python处理时间和日期方面的模块,主要就是datetime、time、calendar三个模块的使用,希望这篇文章对于
- 前言使用 pymongo 进行 group by 操作有两种基本方式,他们都是 mongodb 的原生命令,于 Collection 对象上
- 1.python 和 pytorch的数据类型区别在PyTorch中无法展示字符串,因此表达字符串,需要将其转换成编码的类型,比如one_h
- 如果您是HTML的初学者,请您先自学HTML。因为DHTML是现有的HTML技术的一个综合,所以HTML语言对学习动态HTML是
- 这篇文章主要介绍了通过python检测字符串的字母,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 本文实例讲述了Python pandas RFM模型应用。分享给大家供大家参考,具体如下:什么是RFM模型根据美国数据库营销研究所Arthu
- 原始结构:Column1 Column2----------- ----------1 A1 B2 C2 D2 E3 F查询效果:Colum
- 有些时候我们需要得到刚刚插入数据库中的条目id,用于相关系统的更改,在以前我是使用select+top 1+desc 这种笨方法实现的,在没
- 内容摘要:FCKeditor至今已经到了2.3.1版本了,对于国内的WEB开发者来说,也基本上都已经“闻风知多少”了,很多人将其融放到自己的
- 前言:在软件测试中,为项目编写接口自动化用例已成为测试人员常驻的测试工作。本文以python为例,基于笔者曾使用过的三种用例数据读取方法:x
- Ruby中有一个很方便的Struct类,用来实现结构体。这样就不用费力的去定义一个完整的类来仅仅用作访问属性。class Dog <
- 1. assert函数说明:Assert statements are a convenient way to insert debuggi
- Go Gin 实现文件的上传下载流读取文件上传routerrouter.POST("/resources/common/uploa
- 本文实例讲述了Python实现链表反转的方法。分享给大家供大家参考,具体如下:Python实现链表反转链表反转(while迭代实现):链表的
- 然而,微软sql server在处理这类索引时,有个重要的缺陷,那就是把本该编译成索引seek的操作编成了索引扫描,这可能导致严重性能下降
- 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自
- 近来,越来越多的数据科学家开始使用Python,我不由得想到,尽管他们从pandas、scikit-learn和numpy这些库中得到了不少