在函数编程语言中, 闭包是一个比较重要且强大的特性.

python 也支持闭包.

什么是闭包?

如果一个函数使用了外部函数的局部变量, 那么这个函数就是一个闭包.

闭包的特点:

  1. 闭包函数可以访问他所在的外部函数的局部变量. 即使外部函数已经运行结束, 对闭包函数来说仍然可以访问到外部函数的局部变量

  2. 闭包访问外部函数的局部变量的值, 总是这个变量的最新的值!


1.1.定义一个闭包

def outer():
    x = 20

    def inner():
        """
        inner 函数访问了外部函数 outer 的局部变量 x, 所以这个时候 inner
        就是一个闭包函数.
        :return:
        """
        nonlocal x
        x += 10
        return x

    x = 30
    return inner


# 调用 outer, 得到的是内部的闭包函数 inner   所以 f 和 inner 其实指向了同一个函数对象
f = outer()
''' 
调用 f. f是一个闭包函数,所以他访问的总是外部变量的最新的值, 
所以 f 执行的时候 x 的值已经是30. 最终返回的是40
'''
print(f())


1.2.闭包的应用

闭包很强大, 也有一些比较适合的场景!


惰性求值(lazy evaluation, 延迟求值)

def foo(msg):
    def say_msg():
        print("hello" + str(msg))

    return say_msg

say = foo("志玲")

say()

说明: 上面的代码中foo函数仅仅是声明了一个嵌套函数, 和把这个嵌套函数返回.

真正的代码其实是定义在了内部的嵌套函数中.

这种写法就是一种惰性求值!


使用闭包保持状态

如果需要在一系列函数调用中保持某种状态, 使用闭包是一种非常高效的方法.

一个简单的计数器:

def count_down(num):
    def next():
        nonlocal num
        temp = num
        num -= 1
        return temp

    return next


# 使用前面的函数计数

next = count_down(10)

while True:
    value = next()  # 每调用一次就会减少一次计数
    print(value)
    if value == 0:
        break


还有一些其他应用, 比如装饰器, 下节再学习.

Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-02-25 07:12:09

results matching ""

    No results matching ""