文档章节

Python入门笔记之闭包

LeeHH
 LeeHH
发布于 2016/07/21 17:06
字数 416
阅读 5
收藏 0

我们先来看一段代码:

def sum_test(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum

这时你会发现 发现没法把 lazy_sum 移到 sum_test 的外部,因为它引用了 sum_test 的参数 lst。像这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。

闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。以下的这段代码则不符合闭包的特点:

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs
f1,f2,f3 = count()
print f1(),f2(),f3()
#输出值为:9 9 9

输出值为9 9 9,而不是1 4 9,这是因为在count()只是返回了三个f()的函数,并没有执行f()内的代码,直到走到f1(),f2(),f3()时,才执行了f()内的代码,而这个时候i的值已经变成了3,所以三个i*i的结果都将是9。这就不符合闭包的确保引用的局部变量在函数返回后不能变的特点。应该改为以下的代码:

def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def h():
                return j*j
            return h
        r = f(i)
        fs.append(r)
    return fs
f1, f2, f3= count()
print f1(),f2(),f3()
#输出值为:1 4 9

这时调用count()返回的三个函数时,返回的函数内的j*j中的j则不是一个会跟着for循环而变的变量了。这就是一个闭包了。

© 著作权归作者所有

LeeHH
粉丝 1
博文 35
码字总数 36068
作品 0
深圳
程序员
私信 提问
DeepLearning笔记: 如何在 Docker 里切换 Python 版本

在 DeepLearning-1:神经网络和 Docker 入门 一文中,我们介绍了 Docker 环境的安装和使用。 然后,00 遇到了 Python 的经典问题:Python 2 还是 Python 3?TensorFlow image 默认安装的是 ...

Kidult
2018/01/14
0
0
分享我自己写的一套Python爬虫学习经验

最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多。学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴...

崔庆才
2015/02/23
3.7K
25
看书 Python 源码分析笔记 (六) 函数

第11章 Python 虚拟机中的函数机制 函数是程序重要的抽象. 在 Python 中使用 PyFrameObject 实现栈帧, 它们构成栈帧链. PyFunctionObject 对象 对函数的表示内部使用此对象: 对象 PyCodeObje...

刘军兴
2015/12/22
0
0
免费的计算机编程类中文书籍

免费的编程中文书籍索引,欢迎投稿。 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版。 stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版 github 上的一个流行的编...

justjavac
2014/08/13
2.8K
10
Scala笔记整理(五):函数式编程

[TOC] 作为值传递的函数 测试代码如下: 输出结果如下: 匿名函数 测试代码如下: 输出结果如下: 其实前面在学习ArrayBuffer的时候已经有使用过匿名函数: 带函数参数的函数(高阶函数) 说...

xpleaf
2018/04/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
2
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
3
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部