内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。

举例:希望一次返回3个函数,分别计算1x1,2x2,3x3:
def count():
    fs = []
    for i in range(1, 4):
        def f():
            return i*i
        fs.append(f)
    print(fs)
    return fs

f1, f2, f3 = count()
print(f1(), f2(), f3())
# 结果全部都是 9。原因就是当count()函数返回了3个函数时,这3个函数所引用的变量 i 的值已经变成了3。
# 由于f1、f2、f3并没有被调用,所以,此时他们并未计算 i*i,当 f1 被调用时:9。
# 因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。

返回闭包不能引用循环变量,请改写count()函数,让它正确返回能计算1x1、2x2、3x3的函数。
def count1():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        result = f(i)
        fs.append(result)
    print(fs)
    return fs
a1, a2, a3 = count1()
print(a1(), a2(), a3())

转载于:https://www.cnblogs.com/zhang-teng/p/6198448.html

Python 函数式编程(3) —— 闭包相关推荐

  1. 一篇文章解决Python函数式编程与闭包的问题

    函数式编程 函数式编程这个概念我们可能或多或少都听说过,刚听说的时候不明觉厉,觉得这是一个非常黑科技的概念.但是实际上它的含义很朴实,但是延伸出来许多丰富的用法. 在早期编程语言还不是很多的时候,我们 ...

  2. 三分钟理解Python函数式编程与闭包

    函数式编程 函数式编程这个概念我们可能或多或少都听说过,刚听说的时候不明觉厉,觉得这是一个非常黑科技的概念.但是实际上它的含义很朴实,但是延伸出来许多丰富的用法. 在早期编程语言还不是很多的时候,我们 ...

  3. 五分钟学会python函数_Python——带你五分钟了解函数式编程与闭包

    今天是Python专题的第9篇文章,咱们来聊聊Python的函数式编程与闭包.编程 函数式编程 函数式编程这个概念咱们可能或多或少都据说过,刚据说的时候不明觉厉,以为这是一个很是黑科技的概念.可是实际 ...

  4. python 函数式编程包_Python——详解函数式编程与闭包

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第9篇文章,我们来聊聊Python的函数式编程与闭包. 函数式编程 函数式编程这个概念我们可能或多或少都听说过,刚听 ...

  5. 函数式编程语言python-10分钟学会python函数式编程

    原标题:10分钟学会python函数式编程 在这篇文章里,你将学会什么是函数范式以及如何使用Python进行函数式编程.你也将了解列表推导和其它形式的推导. 函数范式 在命令式范式中,通过为计算机提供 ...

  6. 函数式编程语言python-Python——五分钟理解函数式编程与闭包

    今天是Python专题的第9篇文章,我们来聊聊Python的函数式编程与闭包. 函数式编程 函数式编程这个概念我们可能或多或少都听说过,刚听说的时候不明觉厉,觉得这是一个非常黑科技的概念.但是实际上它 ...

  7. python函数式编程读取数据-python学习笔记9:函数式编程

    函数式编程(FunctionalProgramming) 基于lambda演算的一种编程方式 程序中只有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言: LISP, Haskell Py ...

  8. python编写函数_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  9. Python函数式编程简介(二)返回函数

    本文为Python函数式编程的第二部分主要讲解返回函数和闭包 2.返回函数 2.1.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常 ...

最新文章

  1. 用ul和li实现表格table效果 (转)
  2. 树莓派wiringPi常用的函数介绍
  3. Python面向对象编程Day 25部分知识点
  4. 文件及文件组备份与还原示例.sql
  5. 把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析
  6. virtualbox macos_MacOS 终于可以完美使用 Podman 了!
  7. 求平均数、百分率、最大值、最小值、两个字段相差秒数的SQL
  8. Hive中表名、别名的限制
  9. mysql学生信息管理系统设计_学生信息管理系统的设计与实现(MyEclipse,MySQL)
  10. 数据库课程设计实验报告--图书管理系统
  11. 一文读懂机器学习(转)
  12. Paper Reading: Re-ranking Person Re-identification with k-reciprocal Encoding
  13. bzoj3991 [SDOI2015]寻宝游戏 set
  14. CSS实例——梦幻西游
  15. 举例在移动HTML5 UI框架有那些
  16. OpenCV调试利器——Image Watch插件的安装和使用
  17. python计算圆周率的方法_用python计算圆周率PI
  18. 看完张一鸣近十年微博,我总结了这些成长特质
  19. android 11.0 12.0自定义开机向导app
  20. 恢复参数文件spfile

热门文章

  1. 【前端 · 面试 】HTTP 总结(四)—— HTTP 状态码
  2. 初识二进制2:指令系统
  3. react脚手架_react脚手架create-react-app安装与使用
  4. java计算两个字符串格式的时间间隔多少天多少小时多少分钟
  5. C# WinForm 控件美化之改变ListView Head 的背景色
  6. SSM框架之Spring MVC(一)
  7. Silverlight 中的通信安全访问策略
  8. php分页3 1,经典php分页代码与分页原理(1/3)
  9. SparkMapReduce的区别、多线程多进程的区别
  10. MySql的语法规范