`
dbp_cn
  • 浏览: 86007 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

python 闭包

 
阅读更多

返回函数:

阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: 

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

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

 

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

 当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数: 

 

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function sum at 0x10452f668>

 调用函数f时,才真正计算求和的结果: 

>>> f()
25

 在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。 

再看一个例子: 

def make_adder(addend):
    def adder(augend):
        return augend + addend
    return adder

p = make_adder(23)
q = make_adder(44)

print p(100)    #123
print q(100)    #144

 我们发现,make_adder是一个函数,包括一个参数addend,比较特殊的地方是这个函数里面又定义了一个新函数,这个新函数里面的一个变量正好是外部make_adder的参数.也就是说,外部传递过来的addend参数已经和adder函数绑定到一起了,形成了一个新函数,我们可以把addend看做新函数的一个配置信息,配置信息不同,函数的功能就不一样了,也就是能得到定制之后的函数. 

我们发现,虽然p和q都是make_adder生成的,但是因为配置参数不同,后面再执行相同参数的函数后得到了不同的结果.这就是闭包. 

 

装饰器例子:

def makebold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped

def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped

@makebold
@makeitalic
def hello():
    return "hello world"

print hello()  # 结果: <b><i>hello world</i></b>

 这就是装饰器,其实,装饰器就是一种闭包,我们再回想一下装饰器的概念:对函数(参数,返回值等)进行加工处理,生成一个功能增强版的一个函数。再看看闭包的概念,这个增强版的函数不就是我们配置之后的函数吗?区别在于,装饰器的参数是一个函数或类,专门对类或函数进行加工处理。

 

分享到:
评论

相关推荐

    Python闭包实例closure.py

    Python闭包实例closure.py 简单示例闭包的使用 简单示例闭包的使用

    Python闭包:深入理解与应用场景解析.zip

    Python闭包是编程语言中的一种高级特性,它在函数式编程和面向对象编程中都扮演着重要的角色。在Python中,闭包是指一个内嵌函数(nested function)对其外部作用域变量的引用,即使外部函数已经执行完毕,闭包依然...

    对Python闭包与延迟绑定的方法详解

    Python闭包可能会在面试或者是工作中经常碰到,而提到Python的延迟绑定,肯定就离不开闭包的理解,今天总结下 关于闭包的概念以及一个延迟绑定的面试题。 Python闭包 1、什么是闭包,闭包必须满足以下3个条件: 必须...

    Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例

    本文实例讲述了Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作。分享给大家供大家参考,具体如下: 实例对象也可以实现闭包的功能,不过实例对象消耗的资源(内存)比闭包多。 demo.py(闭包): # 闭包,...

    Python闭包实现计数器的方法

    本篇文章将深入探讨如何利用Python闭包来实现一个简单的计数器,并解释闭包的基本概念和相关技巧。 首先,我们要理解闭包的核心特征:一个函数内部定义了另一个函数,并且内部函数引用了外部函数的局部变量。当外部...

    python闭包与引用以及需要注意的陷阱

    Python 闭包是一种重要的编程概念,它涉及到函数和其引用环境的组合。在 Python 中,闭包通常由嵌套函数创建,当外部函数返回内部函数时,内部函数还能访问外部函数的作用域,尤其是那些在外部函数中定义但在内部...

    Python闭包开发

    ### Python闭包开发知识点 #### 一、理解Python闭包 在Python中,闭包(Closure)是一种特殊类型的函数,它能够记住并访问其定义时所在的作用域中的变量,即使在其定义时的作用域已经关闭。这实际上就是说,闭包...

    python高阶闭包练习题

    在Python的世界里,"高阶闭包"是一个高级概念,对于理解函数的内部工作原理和实现更复杂的编程逻辑至关重要。本练习题旨在帮助你深入理解和掌握Python中的高阶闭包。 首先,让我们澄清一下什么是闭包。闭包是Python...

    Python闭包函数定义与用法分析

    在Python编程中,闭包(closure)是一个非常重要的概念,它是函数式编程的一个重要特性,允许一个函数访问并操作函数外部的变量。闭包在很多语言中都有应用,比如Python、JavaScript等。 闭包函数的定义:在Python...

    python闭包.html

    什么是闭包?如何设置闭包?创建闭包可以用来干什么?闭包的好处,如何正确使用闭包?通过闭包能创建一些只有当前函数能访问的变量,

    python闭包深入(csdn)————程序.pdf

    Python中的闭包是一种重要的编程概念,它涉及到代码块、局部变量、全局变量和自由变量等基本概念。在Python中,代码块包括模块、函数体和类定义等。局部变量是在特定代码块中定义并绑定的变量,全局变量则在模块级别...

    基于Python闭包及其作用域详解

    关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被称为闭包...

    17-18-Python闭包函数+生成器+装饰器及原理

    在Python的世界里,闭包、生成器和装饰器是三个非常重要的概念,它们对于编写高效、灵活的代码至关重要。 首先,我们来详细解释一下闭包。闭包是在Python中函数的一种特性,它是指有权访问另一个函数作用域中的变量...

    wistbean#fxxkpython#Python 闭包1

    闭包可以让使用者访问到函数内部的数据,也就是可以拿到在闭包内所提供的隐藏数据。如果某个功能只需要一个函数,可以使用闭包而不需另创建一个类。第一次将参数传入并 保

    python 闭包和装饰器(csdn)————程序.pdf

    Python中的闭包和装饰器是两种非常重要的编程概念,它们在函数式编程和面向对象编程中都有着广泛的应用。本文将详细解析这两个概念及其在实际编程中的应用。 首先,我们来看闭包。闭包是由函数嵌套和作用域规则定义...

    Python 闭包的使用方法

    以下是关于Python闭包的详细说明: 1. **嵌套函数与非局部变量**: 在Python中,一个函数可以定义在另一个函数内部,这样的函数被称为嵌套函数。嵌套函数可以访问外部(包围)函数的变量,这些变量称为非局部变量...

Global site tag (gtag.js) - Google Analytics