返回函数:
阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的:
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闭包是编程语言中的一种高级特性,它在函数式编程和面向对象编程中都扮演着重要的角色。在Python中,闭包是指一个内嵌函数(nested function)对其外部作用域变量的引用,即使外部函数已经执行完毕,闭包依然...
Python闭包可能会在面试或者是工作中经常碰到,而提到Python的延迟绑定,肯定就离不开闭包的理解,今天总结下 关于闭包的概念以及一个延迟绑定的面试题。 Python闭包 1、什么是闭包,闭包必须满足以下3个条件: 必须...
本文实例讲述了Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作。分享给大家供大家参考,具体如下: 实例对象也可以实现闭包的功能,不过实例对象消耗的资源(内存)比闭包多。 demo.py(闭包): # 闭包,...
本篇文章将深入探讨如何利用Python闭包来实现一个简单的计数器,并解释闭包的基本概念和相关技巧。 首先,我们要理解闭包的核心特征:一个函数内部定义了另一个函数,并且内部函数引用了外部函数的局部变量。当外部...
Python 闭包是一种重要的编程概念,它涉及到函数和其引用环境的组合。在 Python 中,闭包通常由嵌套函数创建,当外部函数返回内部函数时,内部函数还能访问外部函数的作用域,尤其是那些在外部函数中定义但在内部...
### Python闭包开发知识点 #### 一、理解Python闭包 在Python中,闭包(Closure)是一种特殊类型的函数,它能够记住并访问其定义时所在的作用域中的变量,即使在其定义时的作用域已经关闭。这实际上就是说,闭包...
在Python的世界里,"高阶闭包"是一个高级概念,对于理解函数的内部工作原理和实现更复杂的编程逻辑至关重要。本练习题旨在帮助你深入理解和掌握Python中的高阶闭包。 首先,让我们澄清一下什么是闭包。闭包是Python...
在Python编程中,闭包(closure)是一个非常重要的概念,它是函数式编程的一个重要特性,允许一个函数访问并操作函数外部的变量。闭包在很多语言中都有应用,比如Python、JavaScript等。 闭包函数的定义:在Python...
什么是闭包?如何设置闭包?创建闭包可以用来干什么?闭包的好处,如何正确使用闭包?通过闭包能创建一些只有当前函数能访问的变量,
Python中的闭包是一种重要的编程概念,它涉及到代码块、局部变量、全局变量和自由变量等基本概念。在Python中,代码块包括模块、函数体和类定义等。局部变量是在特定代码块中定义并绑定的变量,全局变量则在模块级别...
关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被称为闭包...
在Python的世界里,闭包、生成器和装饰器是三个非常重要的概念,它们对于编写高效、灵活的代码至关重要。 首先,我们来详细解释一下闭包。闭包是在Python中函数的一种特性,它是指有权访问另一个函数作用域中的变量...
闭包可以让使用者访问到函数内部的数据,也就是可以拿到在闭包内所提供的隐藏数据。如果某个功能只需要一个函数,可以使用闭包而不需另创建一个类。第一次将参数传入并 保
Python中的闭包和装饰器是两种非常重要的编程概念,它们在函数式编程和面向对象编程中都有着广泛的应用。本文将详细解析这两个概念及其在实际编程中的应用。 首先,我们来看闭包。闭包是由函数嵌套和作用域规则定义...
以下是关于Python闭包的详细说明: 1. **嵌套函数与非局部变量**: 在Python中,一个函数可以定义在另一个函数内部,这样的函数被称为嵌套函数。嵌套函数可以访问外部(包围)函数的变量,这些变量称为非局部变量...