函数式编程 之

返回函数

  • 函数可以返回具体的值
  • 也可以返回一个函数作为结果

1. 引子

1.1 定义一个普通函数

>>> def func():
... print("abc")
... return None
...
>>> my_func = func()
abc
>>> print(my_func)
None
>>> my_func
>>>

1.2 函数作为返回值返回

  • 被返回的函数在函数体内定义
In [1]: def out_func():
...: def in_func():
...: print("in func")
...: return 100
...: return in_func
...:
...: In [2]: f = out_func() In [3]: print(type(f))
<class 'function'> In [4]: print(f)
<function out_func.<locals>.in_func at 0x000001B9B99D6BF8> In [5]: f()
in func
Out[5]: 100 In [6]:

1.3 带参数列表的返回函数

>>> def out_func(*args):
... def in_func():
... rst = 0
... for i in args:
... rst += i
... return rst
... return in_func
...
>>> f1 = out_func(1, 2, 3, 4, 5)
>>> f1()
15
>>> f2 = out_func(6, 7, 8, 9, 10)
>>> f2()
40

2. 闭包 closure

  • 当一个函数在内部定义函数,并且内部函数应用外部函数的参数或者局部变量时,内部函数被当做返回值之时,相关参数和变量会保存在返回的函数中,这种结果,叫闭包
  • 上方 1.3 带参数列表的返回函数 的例子就是一个标准闭包结构

2.1 常见的关于闭包的坑

>>> def out_func():
... res = []
... for i in range(1, 4):
... def in_func():
... return i * i
... res.append(in_func)
... return res
...
>>> f1, f2, f3 = out_func()
>>> f1()
9
>>> f2()
9
>>> f3()
9
>>>

2.2 造成上述状况的原因

  • 返回函数引用了变量 ii 并非立即执行,而是等到三个函数都返回的时候才统一使用,此时 i 已经变成了 3,最终调用的时候,返回的都是 3*3

  • 由此可见:返回闭包时,返回函数不能引用任何循环变量

2.3 解决方案

  • 再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不再改变
>>> def out_func():
... def in1(n):
... def in2():
... return n * n
... return in2
... res = []
... for i in range(1, 4):
... res.append(in1(i))
... return res
...
>>> f1, f2, f3 = out_func()
>>> f1()
1
>>> f2()
4
>>> f3()
9
>>>

[Python3] 036 函数式编程 返回函数的更多相关文章

  1. [Python3] 034 函数式编程 匿名函数

    目录 函数式编程 Functional Programming 1. 简介 2. 函数 3. 匿名函数 3.1 lambda 表达式也称"匿名函数" 3.2 lambda 表达式的 ...

  2. python函数式编程——返回函数

    1.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 2.闭包 注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还 ...

  3. Python实用笔记 (13)函数式编程——返回函数

    函数作为返回值 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ax + n ret ...

  4. Python进阶之函数式编程(把函数作为参数)

    什么是函数式编程? 什么是函数式编程? 函数:function 函数式:functional,一种编程范式 函数式编程是一种抽象计算的编程模式 函数≠函数式,比如:计算≠计算机 在计算机当中,计算机硬 ...

  5. [Python3] 035 函数式编程 高阶函数

    目录 函数式编程 之 高阶函数 1. 引子 2. 系统提供的高阶函数 3. functools 包提供的 reduce 4. 排序 函数式编程 之 高阶函数 把函数作为参数使用的函数,叫高阶函数 1. ...

  6. Python3(十) 函数式编程: 匿名函数、高阶函数、装饰器

    一.匿名函数 1.定义:定义函数的时候不需要定义函数名 2.具体例子: #普通函数 def add(x,y): return x + y #匿名函数 lambda x,y: x + y 调用匿名函数: ...

  7. Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  8. js函数式编程——蹦床函数

    概述 这是我在学习函数式编程的时候,关于递归,尾递归,相互递归和蹦床函数的一些心得,记下来供以后开发时参考,相信对其他人也有用. 参考资料:JavaScript玩转Clojure大法之 - Tramp ...

  9. 1.python函数式编程-map函数

    编程方法论 面向过程 函数式 面向对象 面向过程 将编程过程拆分成多个步骤,在函数中按照每个步骤进行编程: 函数式编程 编程语言定义的函数+数学意义的函数 1.不可变,不用变量保存状态,不修改变量: ...

随机推荐

  1. jmeter 5.0,http请求登录返回的cookie在头部处理方法

    http登录之后返回的cookie在响应的头部,再次请求虽然加了cookie管理器,但是下一个请求调用响应是登陆失效,这里讲一下我的解决方法 1:在登录之后添加正则表达式,提取cookie 2:提取之 ...

  2. [Docker]docker搭建私有仓库(ssl、身份认证)

    docker搭建私有仓库(ssl.身份认证) 环境:CentOS 7.Docker 1.13.1 CentOS 7相关: https://www.cnblogs.com/ttkl/p/11041124 ...

  3. 【原创】谈一个数学教育专业的IT职业生涯

    2003年,有许多值得记住,第一个是非典,第二个就是高考数学卷.直到今年2019年,时隔16年,有人说2019年高考数学卷难度堪比2003年,但还没难到2003年的程度. 我,2003年高考,进考场先 ...

  4. codevs 1501 二叉树最大宽度和高度x

                         题目描述 Description 给出一个二叉树,输出它的最大宽度和高度. 输入描述 Input Description 第一行一个整数n. 下面n行每行有两 ...

  5. 推荐系统系列(一):FM理论与实践

    背景 在推荐领域CTR(click-through rate)预估任务中,最常用到的baseline模型就是LR(Logistic Regression).对数据进行特征工程,构造出大量单特征,编码之 ...

  6. Marcin and Training Camp

    D. Marcin and Training Camp 参考:D. Marcin and Training Camp 思路:首先先确定最大成员的\(a_i\),因为不能够某个成员i认为自己比其他所有成 ...

  7. 删除git的远程分支

    命令:$ git push origin [空格][冒号][需要删除的分支名字] git push origin :dev 删除git的凭证的方法: 控制面板\用户帐户\凭据管理器  --->普 ...

  8. y7000笔记本 darknet-yolo安装与测试(Ubuntu16.04+Cuda9.0+Cudnn7.1)

    https://zhuanlan.zhihu.com/p/41096599 1.先查看是否安装有以下组件,若有先考虑彻底删除再安装(安装严格按照下面顺序进行) 查看nvidia 版本 nvidia-s ...

  9. 编写可维护的JavaScript代码(部分)

    平时使用的时VS来进行代码的书写,VS会自动的将代码格式化,所有写了这么久的JS代码,也没有注意到这些点.看了<编写可维护的javascript代码>之后,做了些笔记. var resul ...

  10. linux出现Redirecting to /bin/systemctl start mysqld.service,解决方法

    上去就是一个命令     /bin/systemctl start httpd.service