Python札记23_闭包(更新)

浏览: 1164

Python是一种面向对象的编程语言,在Python中一切皆是对象。函数也是对象。变量拥有的属性,函数同样拥有。因此在函数内部创建一个函数的行为是完全合法的。这种函数称为嵌套函数或者内嵌函数。闭包称为词法闭包或者函数闭包,是引用了自由变量的函数。装饰器是一种特殊的闭包应用。闭包有两个特点:

  • 定义在另一个函数里面,嵌套作用
  • 内部函数对外部函数作用域里面变量的引用

闭包与装饰器


通过一个例子认识闭包:

  • foo外部的变量能够被引用
  • foo内部定义的变量却不能被引用

如果想函数外面使用内部定义的变量,how to do it?

方法1:通过函数嵌套实现

def foo():
a = 3
def bar():
return a
return bar # foo的返回值是bar函数

res = foo() # 调用foo函数:res是个函数对象,执行bar函数的代码
res()

image.png

image.png

总结

  • foo函数里面有a=3bar()函数,二者互不影响,变量a
    相对于bar()函数是自由变量
  • bar()函数应用了自由变量a
  • bar()函数就是定义的闭包

下面的例子说明函数内部的属性都有生命周期,在函数执行期间才有。

image.png

def func():  # 外部函数
print("this is func")
def func1(): # 内部函数在外部函数执行的过程中被创建
print("this is func1")

image.png

  • 外部函数能够直接运行,内部函数不能直接运行
  • 运行外部函数,内部函数被创建

def func():  # 外部函数
print("this is func")
def func1(): # 内部函数
print("this is func1")
return func1

var = func() # 外部函数运行,内部函数就被创建
# func执行创建了func1
var() # var == func1

image.png

def func():  # 外部函数
a = 1 # 外部函数作用域的变量
print("this is func")
def func1(num): # 内部函数
print("this is func1")
print(num + a)
return func1 # 返回的是一个函数:函数里面的东西很多;用func1函数将变量a包装起来

var = func() # 外部函数运行,内部函数就被创建
# func执行创建了func1
var(3) # var == func1

image.png

  • func1是闭包函数
  • 私有化了外部函数作用域的变量a,实现数据封装

练习题:使用闭包写出一个抛物线函数

def pao_wu_xian(a, b, c):
def para(x):
return a*x**2 + b*x + c
return para

res = pao_wu_xian(2, 3, 4) # 先调用pao_wu_xian函数
res(2) # 调用内嵌的para函数

18

推荐 0
本文由 皮大大 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册