Python札记人工智能/模式识别/机器学习精华专题大数据,机器学习,人工智能

Python札记23_闭包(更新)

2019-06-29  本文已影响0人  皮皮大

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

闭包与装饰器


通过一个例子认识闭包:

如果想函数外面使用内部定义的变量,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
总结

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

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

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

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
image.png
上一篇 下一篇

猜你喜欢

热点阅读