本文为Python函数式编程的第二部分主要讲解返回函数和闭包

2、返回函数

2.1、函数作为返回值
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的:

def calc_sum(*args):ax = 0for n in args:ax = ax + nreturn ax

但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数:

def lazy_sum(*args):def sum():ax = 0for n in args:ax = ax + nreturn axreturn sum# 当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
调用函数f时,才真正计算求和的结果:
>>> f()
25

2.2、闭包
正如上边的例子,内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。
闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。
一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了f()才执行。我们来看一个例子:

def count():fs = []for i in range(1, 4):def f():return i*ifs.append(f)return fs
f1, f2, f3 = count()
#在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。
>>> f1()
9
>>> f2()
9
>>> f3()
9

全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。

返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变

def count():def f(j):def g():return j*jreturn gfs = []for i in range(1, 4):fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()return fs>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9
# 或者:
def count():fs = []for i in range(1, 4):def f(a = i):return a*afs.append(f)return fs
f1, f2, f3 = count()

闭包的作用:
封装
代码复用

Python函数式编程简介(二)返回函数相关推荐

  1. Python函数式编程简介(一)高阶函数

    本文概括介绍Python函数式编程的一些概念及用法,详细请参考: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df ...

  2. javascript里的偏函数——本质函数式编程+闭包,返回函数

    最终效果: var greet = function(greeting, name) {return greeting + ' ' + name; };var sayHelloTo = _.parti ...

  3. python函数式编程、高阶函数

    1.map() python内置的高阶函数,接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并返回. def f(x):return x * xprin ...

  4. Python函数式编程简介(三)匿名函数

    3.匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x^2时,除了定义一个f ...

  5. Python函数式编程简介(五)偏函数

    5.偏函数 Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function).要注意,这里的偏函数和数学意义上的偏函数不一样. 在介绍函数参数的时候,我 ...

  6. python内置高阶函数求导_Python——函数式编程、高阶函数和内置函数,及

    Python--函数式编程.高阶函数及内置函数 函数式编程 一.不可变数据:不用变量保存状态不修改变量 二.第一类对象:函数即"变量" 1.函数名可以当做参数传递 2.返回值可以是 ...

  7. Python函数式编程——map()、reduce()

    提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理大规模海量数据,并在之后广泛的应用于Google的各项应用中,2006年A ...

  8. Python 函数式编程,Python中内置的高阶函数:map()、reduce()、filter()与sorted(),Python中返回函数

    函数式编程 是一种编程范式,比函数更高层次的抽象. 函数式编程将计算视为函数而非指令. 纯函数式编程:不需要变量,没有副作用,测试简单. 支持高阶函数,代码简洁. Python 支持的函数式编程 不是 ...

  9. py函数式编程(高阶函数map/reduce/filter/sorted、闭包函数/返回函数、匿名函数lamber、@装饰器decorator、偏函数functool.partial())

    #py函数式编程.py #高阶函数map/reduce/filter/sorted.闭包函数/返回函数.匿名函数lamber.@装饰器decorator.偏函数functool.partial()# ...

最新文章

  1. 分享一个 org.w3c.dom XML 封装
  2. C语言中动态数组的作用,C语言实现动态数组
  3. mysql连接优先级设置_MySQL的按优先级等效连接
  4. Java学习笔记——面向对象
  5. JavaScript——易班优课YOOC课群课程视频立刻完成解决方案
  6. 19/100. Subtree of Another Tree
  7. 批量清除为Button注册的事件
  8. laravel框架——composer导入laravel
  9. 报表在IBM AIX系统下resin部署
  10. AI论文解读丨融合视觉、语义、关系多模态信息的文档版面分析架构VSR
  11. 在STM8单片机中自己实现 printf()函数功能
  12. putty的窗口关闭相关的可能需要注意的细节
  13. 地铁票务管理系统_地铁票务管理工作总结
  14. 两个mysql主从同步_如何配置两个MySQL数据库之间的主从同步功能
  15. Ble扫描导致wifi信号弱/断开解决
  16. 修身、齐家、治国、平天下
  17. SpringBoot:运行项目是报错org.apache.ibatis.builder.IncompleteElementException:
  18. Android中APK安装流程解析
  19. python画出一个小房子简单代码
  20. 奥运五环图形 -《跟小海龟学Python》案例代码

热门文章

  1. 读书(附电子书)|小狗钱钱之白色的拉布拉多
  2. Scala混用Java的集合类调用scala的foreach遍历问题
  3. Python二维码生成库qrcode示例
  4. SVN trunk branch tags 区别
  5. Video : 将使用AD认证的SharePoint网站配置为表单方式登录
  6. mysql将备份的数据导入_成功将MySQL的大型数据导入导出和备份(转载)
  7. js中call与apply用法
  8. stm32串口传输数据第一个数据被吞_STM32串口第一个字节丢失问题的分析过程
  9. mysql 视图用户_MySQL视图,存储过程,用户管理
  10. P6364 1024 程序员节发橙子(贪心+前缀和)