Python札记23_闭包(更新)
2019-06-29 本文已影响0人
皮皮大
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() #


总结
-
foo
函数里面有a=3
和bar()
函数,二者互不影响,变量a
相对于bar()
函数是自由变量 -
bar()
函数应用了自由变量a
bar()
函数就是定义的闭包
下面的例子说明函数内部的属性都有生命周期,在函数执行期间才有。

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

- 外部函数能够直接运行,内部函数不能直接运行
- 运行外部函数,内部函数被创建
def func(): # 外部函数
print("this is func")
def func1(): # 内部函数
print("this is func1")
return func1
var = func() # 外部函数运行,内部函数就被创建
# func执行创建了func1
var() # var == func1

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

- 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
