Python
是一种面向对象的编程语言,在Python
中一切皆是对象。函数也是对象
。变量拥有的属性,函数同样拥有。因此在函数内部创建一个函数的行为是完全合法的。这种函数称为嵌套函数
或者内嵌函数
。闭包称为词法闭包或者函数闭包,是引用了自由变量的函数。装饰器是一种特殊的闭包应用
。闭包有两个特点:
- 定义在另一个函数里面,嵌套作用
- 内部函数对外部函数作用域里面变量的引用
闭包与装饰器
通过一个例子认识闭包:
foo
外部的变量能够被引用foo
内部定义的变量却不能被引用
如果想函数外面使用内部定义的变量,how to do it?
方法1:通过函数嵌套实现
def foo():
a = 3
def bar():
return a
return bar
res = foo()
res()
image.png
image.png
总结
foo
函数里面有a=3
和bar()
函数,二者互不影响,变量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()
var()
image.png
def func():
a = 1
print("this is func")
def func1(num):
print("this is func1")
print(num + a)
return func1
var = func()
var(3)
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)
res(2)
18