Python 闭包

发布于 2024-08-03 16:53:27 字数 2008 浏览 9 评论 0

在查看闭包是什么之前,我们必须首先了解什么是嵌套函数和非局部变量。

Python 中的嵌套函数

在另一个函数内部定义的函数称为嵌套函数。嵌套函数能够访问封闭范围的变量。
在 Python 中,这些非局部变量只能在其作用域内访问,而不能在其作用域外访问。可以通过以下示例进行说明:

# Python 展示嵌套函数
def outerFunction(text):
    text = text
    def innerFunction():
        print(text)
    innerFunction()
if __name__ == '__main__':
    outerFunction('Hey!')

如我们所见,innerFunction() 可以很容易地在 externalFunction 主体内部访问,但不能在其主体外部访问。因此,在这里,将 innerFunction() 视为使用 文本 作为非局部变量的嵌套函数。

Python 闭包

闭包是一个函数对象,即使在内存中不存在值,它也会记住范围内的值。

  • 它是将函数与环境存储在一起的记录:一种映射,该映射将函数的每个自由变量(在本地使用,但在封闭范围内定义的变量) 与值或在闭合时绑定名称的引用相关联。
  • 与普通函数不同,闭包允许函数通过闭包的值或引用的副本访问那些捕获的变量,即使该函数在其作用域之外被调用也是如此。
# Python 展示闭包
def outerFunction(text):
    text = text
    def innerFunction():
        print(text)
    return innerFunction # 注意我们返回函数,没带括号哦
if __name__ == '__main__':
    myFunction = outerFunction('嗨!')
    myFunction()

输出:

嗨!
  • 从上面的代码可以看出,闭包有助于在其范围之外调用函数。
  • 函数 innerFunction 仅在 outerFunction 内部具有范围。但是,通过使用闭包,我们可以轻松扩展其作用域以调用其作用域之外的函数。
# Python 展示闭包
import logging
logging.basicConfig(filename='example.log', level=logging.INFO)
def logger(func):
    def log_func(*args):
        logging.info(
            'Running "{}" with arguments {}'.format(func.__name__, args))
        print(func(*args))
    # 闭包,返回去函数,不带括号
    return log_func
def add(x, y):
    return x+y
def sub(x, y):
    return x-y
add_logger = logger(add)
sub_logger = logger(sub)
add_logger(3, 3)
add_logger(4, 5)
sub_logger(10, 5)
sub_logger(20, 10)
输出:
6
9
5
10

何时以及为何使用闭包:

  1. 由于闭包用作回调函数,因此它们提供了某种数据隐藏。这有助于我们减少使用全局变量。
  2. 当我们的代码中没有几个函数时,闭包被证明是一种有效的方法。但是如果我们需要很多函数,那就去面向对象把(OOP)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

上一篇:

下一篇:

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

梦冥

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文