当前位置:   article > 正文

【python学习】闭包的定义与特点,以及一些常用场景的使用

【python学习】闭包的定义与特点,以及一些常用场景的使用

引言

闭包是理解JavaScript等语言高级功能的重要一步。在Python中,虽然闭包不如在JavaScript中那么常见,但它们仍然是一个强大的工具,特别是在你需要创建可以记住状态的函数时。

一、闭包的定义

闭包是一个函数,以及该函数的词法环境(lexical environment)的引用。这个环境包含了这个函数定义时的任何局部变量。简单来说,闭包让你可以在一个内层函数中访问其外层函数的作用域

二、闭包的组成部分

闭包由两部分组成:

2.1 函数:这是闭包的代码部分,包含了函数的声明。

2.2 词法环境:这是闭包的环境部分,包含了函数定义时的环境。

2.3 代码示例

# 词法环境为outer_function(x)
def outer_function(x):
# 函数为inner_function(y)
    def inner_function(y):
        return x + y
    return inner_function
# 词法环境保存为 x=10
closure_example = outer_function(10)
# 函数保存为 y=5
print(closure_example(5))  # 输出: 15

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

三、闭包是如何工作的

  1. 当一个函数被定义时,它会保存一个指向其词法环境的引用
  2. 这个引用包含了在函数定义时作用域中的所有变量
  3. 闭包通过这个引用来访问这些变量,即使它们在闭包被调用时已经不在作用域内

四、闭包sample

4.1通过sample来理解闭包的工作原理:

# 闭包sample

def make_multiplier_of(n):
    def multiplier(x):
        return x * n
    return multiplier
# 创建一个闭包,它的环境保存了 n = 3
times_three = make_multiplier_of(3)
# 创建另一个闭包,它的环境保存了 n = 5
times_five = make_multiplier_of(5)
# 调用闭包,可以看到它们分别使用了保存的 n 值
print(times_three(9))  # 输出: 27
print(times_five(3))   # 输出: 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4.2注意点:

  • make_multiplier_of 是一个函数,它接受一个参数 n 并定义了一个内层函数 multiplier
  • multiplier 是一个内层函数,它接受一个参数 x 并返回 x 乘以 n 的结果。
  • make_multiplier_of 被调用时,它返回 multiplier 函数,这个函数“记住”了 n 的值。
  • times_threetimes_five 是闭包,它们分别“记住”了 n 为 3 和 5 的状态。

五、闭包的特点

5.1 记忆性

闭包可以“记住”并访问其创建时的词法环境。

5.2 封装性

闭包可以封装私有变量,使得这些变量不被外部访问,只通过特定的接口暴露功能。

5.3 延迟执行

闭包可以延迟执行,直到它们被调用。

六、闭包的应用场景

6.1 模块化代码

通过闭包,可以将相关的代码和数据封装在一起,形成模块。

6.2 柯里化

闭包可以用来实现函数的柯里化,即创建一个函数,它预先填充了一些参数。

6.3 事件处理和回调

闭包在事件处理和异步编程中广泛使用,允许回调函数访问其定义时的作用域。
闭包是一个高级的概念,但它为函数式编程提供了强大的工具。

七、总结

闭包是函数中的一个高级概念,可以使用闭包进行模块化代码和封装代码的操作,从而提高效率

7.1 思维导图

在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/823771
推荐阅读
相关标签
  

闽ICP备14008679号