Python 的闭包,你知道多少?一起聊聊

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:

  1. 了解大厂经验
  2. 拥有和大厂相匹配的技术等

一、前言

看到了很多函数套函数的函数,总之对于 Java 的宝宝来说,没有见过的稀奇,比如:

def log_decorator(func):def wrapper(*args, **kwargs):print(f"Calling function: {func.__name__}")result = func(*args, **kwargs)print(f"Function {func.__name__} executed")return resultreturn wrapper

经过多方搜寻,才知道这是闭包

二、闭包

2.1 闭包简介

wiki 上对闭包的解释

In programming languages, a closure, also lexical closure or function closure, is a technique for implementing lexically scoped name binding in a language with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment.[1] The environment is a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.[b] Unlike a plain function, a closure allows the function to access those captured variables through the closure’s copies of their values or references, even when the function is invoked outside their scope.

简单点来说就是 闭包是指一个函数内部定义的函数,并且内部函数引用了外部函数的变量

2.2 闭包优势

在Python中,这样可以使代码更整洁和可读性更好。然而,函数嵌套提供了一种更高级的编程技术,它具有一些独特的优势和用途,比如:

  1. 封装和信息隐藏:函数嵌套可以用于封装和隐藏实现细节。外层函数可以定义一些内部函数,对外部代码隐藏内部实现逻辑,提供抽象的接口。这样可以降低代码的复杂性,使代码更模块化和可维护。
  2. 限制作用域:函数嵌套可以创建一个新的作用域。内层函数可以访问外层函数的变量和参数,但外部代码无法直接访问这些变量。这种限制作用域的方式可以保护变量免受外部代码的意外修改,提高代码的安全性和可靠性。

2.3 更多的闭包举例

当涉及到函数嵌套的使用场景时,以下是一些具体的例子来说明每个场景:

  1. 闭包:
def outer_function(x):def inner_function(y):return x + yreturn inner_functionadd_five = outer_function(5)
result = add_five(3)  # 返回 8

在这个例子中,outer_function 是外层函数,它接受一个参数 x 并定义了内层函数 inner_functioninner_function 使用外层函数的参数 x 来执行加法运算。通过调用 outer_function 并传入参数 5,我们创建了一个闭包 add_five,它可以在之后的调用中记住 x 的值,并与传入的参数进行相加。

  1. 封装和信息隐藏:
def calculator():def add(x, y):return x + ydef subtract(x, y):return x - yreturn add, subtractadd_func, subtract_func = calculator()
result = add_func(5, 3)  # 返回 8

在这个例子中,calculator 是外层函数,它定义了两个内层函数 addsubtract。通过调用 calculator,我们可以获得这两个函数的引用并在之后的代码中使用它们。这样可以隐藏实现细节,使代码更清晰和可维护。

  1. 辅助函数:
def validate_input(value):def is_positive():return value > 0def is_even():return value % 2 == 0if is_positive() and is_even():print("输入是正数且是偶数")else:print("输入不满足要求")validate_input(10)  # 输出: 输入是正数且是偶数
validate_input(-5)  # 输出: 输入不满足要求

在这个例子中,validate_input 是外层函数,它包含了两个内层函数 is_positiveis_even。这些辅助函数被用于验证输入值的特定条件。通过在外层函数中定义这些辅助函数,可以提高代码的可读性和可维护性。

  1. 递归:
def factorial(n):if n <= 1:return 1else:return n * factorial(n - 1)result = factorial(5)  # 返回 120

在这个例子中,factorial 函数是一个递归函数,它在内部调用自身来计算阶乘。通过不断调用内层函数,逐步解决较小的问题,最终达到解决整个问题的目的。

这些例子展示了函数嵌套在不同场景下的具体应用。函数嵌套的灵活性使其适用于许多编程任务和问题。通过合理地使用函数嵌套,可以提高代码的可读性、可维护性和复用性。

三、总结

本文详细介绍了闭包在计算机编程中的概念和应用。闭包可以通过在函数内部定义函数并引用外部函数的变量来实现词法作用域中的名称绑定。闭包具有封装和信息隐藏、限制作用域等优势,并可以应用于多种编程任务和问题。通过合理地使用闭包,可以提高代码的可读性、可维护性和复用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/730253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 继承、接口与抽象类教程

Java 继承、接口与抽象类教程 在Java编程中&#xff0c;继承、接口和抽象类是面向对象编程&#xff08;OOP&#xff09;的三大核心概念。它们提供了代码重用、多态性和扩展性的基础。本教程将详细解释这三个概念&#xff0c;并通过示例展示如何在Java中使用它们。 一、继承 …

android so载入过程

源自android 9 看源代码的网页 /bionic/libdl/libdl_static.c 好像没用。都是空的 /bionic/libdl/libdl.cpp 主角 22// These functions are exported by the loader 23// TODO(dimitry): replace these with reference to libc.so101// Proxy calls to bionic loader 102_…

工具方法 - 任务跟踪清单

1&#xff0c;先创建Primary Task&#xff0c;不要超过三条。重要的工作任务&#xff0c;一些约好的活动等。 2&#xff0c;再创建Secondary Task&#xff0c;不要超过两条。一些学习任务&#xff0c;杂事琐事等。 3&#xff0c;任务跟踪周期为一周&#xff0c;每日早晚更新状态…

LeetCode | 搜索插入位置

Problem: 35. 搜索插入位置 文章目录 思路解题方法复杂度Code 思路 用python对列表特有的操作——index。 解题方法 见上 复杂度 时间复杂度: O(n) 空间复杂度: O(1) Code class Solution:def searchInsert(self, nums: List[int], target: int) -> int:try:return …

【C++】十大排序算法之 归并排序 快速排序

本次介绍内容参考自&#xff1a;十大经典排序算法&#xff08;C实现&#xff09; - fengMisaka - 博客园 (cnblogs.com) 排序算法是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序…

力扣--滑动窗口438.找到字符串中所有字母异位词

思路分析&#xff1a; 使用两个数组snum和pnum分别记录字符串s和p中各字符出现的次数。遍历字符串p&#xff0c;统计其中各字符的出现次数&#xff0c;存储在pnum数组中。初始化snum数组&#xff0c;统计s的前m-1个字符的出现次数。从第m个字符开始遍历s&#xff0c;通过滑动窗…

史上最细,接口自动化测试用例设计编写总结,一篇带你打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 说到自动化测试&a…

ArrayList 和 LinkedList 的区别

ArrayList ArrayList 是基于动态数组实现的&#xff0c; 它使用一块连续的内存空间来存储元素&#xff0c;因此访问元素的速度非常快&#xff08;时间复杂度为 O(1)&#xff09;&#xff0c; 但是&#xff0c;在插入或删除元素时&#xff0c;如果位置不在数组末尾&#xff0…

亚信安慧AntDB:“融合+实时”引领数据库创新

在当今多变的数据应用场景中&#xff0c;AntDB作为行业领先的超融合流式实时数仓&#xff0c;秉承着“融合实时”的研发理念&#xff0c;全面应对企业日益复杂的数据处理需求。通过SQL接口访问多种执行引擎&#xff0c;AntDB在实现交易、分析等多重能力的“超融合”方面取得了显…

SQL设计时增加说明列

后关闭sql Studio,然后打开注册表,注册表地址: 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\SQL Server Management Studio\18.0_IsoShell\DataProject 如有版本不同,红色内容有所变化,修改内容如下: SSVPropViewColumnsSQL70,SSVPropViewColumnsSQL80 全修改为 1,2,6,7…

魔方,3循环是你的秘密[嗑瓜子]。​

引理1.任意Sn中的元素&#xff1a;(N_1N_2N_3...N_m) 证明&#xff1a; (N_1N_2N_3...N_m) (N_1N_m)(N_1N_m-1)...(N_1N_2) 举例&#xff1a; 比如(1234) (14)(13)(12) (3214) (34)(31)(32) 2.任意An可以表示成3循环的乘积&#xff0c; 证明&#xff1a; 1.An中的元素属于…

sql | 左连接、右连接、内连接、全连接

其实这个内容算是老掉牙了 左连接、右连接、内连接、全连接从字面上都好理解 接下来我们来一一解疑 左连接&#xff1a;以左表为主表&#xff0c;根绝条件匹配右表&#xff0c;当右表部分记录因为条件不匹配显示为空&#xff0c;所以最终结果是左表全显示&#xff0c;右表存在字…

抖店无货源模式,采购商品、平台渠道正规吗?相关基础问题解答

我是王路飞。 无货源模式&#xff0c;相信你们也都不陌生了。 每个电商平台都存在这种模式&#xff0c;且我以为&#xff0c;每个电商平台的发展壮大&#xff0c;最应该感谢的就是这些无货源商家了。 而现在说到无货源&#xff0c;最适合普通人的无疑就是抖音小店了。 今天…

[云原生] k8s之存储卷

一、emptyDir存储卷 当Pod被分配给节点时&#xff0c;首先创建emptyDir卷&#xff0c;并且只要该Pod在该节点上运行&#xff0c;该卷就会存在。正如卷的名字所述&#xff0c;它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件&#xff0c;尽管该卷可以挂载到每…

汽车上的各种质量:整备质量、总质量、装载质量、簧上质量、簧下质量

文章目录 前言一、整备质量二、额定总质量三、额定装载质量四、簧上质量五、簧下质量总结 前言 一、整备质量 整备质量指的是汽车按照出厂技术条件完全配备&#xff08;包括备胎、工具、各种油水等&#xff09;的质量。汽车的整备质量也就是人们常说的一辆汽车的自重&#xf…

快速提高 Python 爬虫的效率和稳定性

为了提高Python爬虫的效率和稳定性&#xff0c;需要综合考虑多个方面&#xff0c;包括优化网络请求、合理设计爬取策略、处理异常情况、使用合适的工具和库等。以下是一些详细的技术和方法&#xff0c;帮助大家快速提高Python爬虫的效率和稳定性。 1. 网络请求优化 异步请求 …

【Redis】redis持久化

redis 持久化 所谓的持久化&#xff0c;就是把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。 redis 开始是将所有数据保持在内存中&#xff0c;对数据的更新将根据策略配置异步地保存在磁盘中。 持久化的方式 快照方式 快照是某时某刻对数据的完整备份。在以…

Flask从入门到精通

Flask从入门到精通 Flask 0.Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架&#xff0c;对于Werkzeug本质是Socket服务端&#xff0c;其用于接收http请求并对请求进行预处理&#xff0c;然后触发Flask框架&#xff0c;开发人员基…

3dmax画图卡顿解决方法---模大狮模型网

当你在使用3D Max进行画图时遇到卡顿问题&#xff0c;可以尝试以下方法来解决&#xff1a; 减少模型复杂度&#xff1a;如果你的场景中有过多的高细节模型&#xff0c;可能会导致卡顿。尝试减少模型的复杂度&#xff0c;合并或简化多边形数量过多的模型。这将减轻计算机的负担&…

【UE 材质 Niagara】爆炸效果

目录 效果 步骤 一、材质部分 二、Niagara部分 效果 步骤 一、材质部分 1. 创建一个材质&#xff0c;这里命名为“M_Burst” 打开“M_Burst”&#xff0c;设置混合模式为半透明&#xff0c;设置着色模型为无光照&#xff0c;勾选双面显示 在材质图表中首先创建扰动效果 其…