Python 深入学习局部函数和闭包函数

目录

局部函数与闭包函数的关联

变量捕获与状态保留

应用场景的交集与差异

闭包的本质

局部函数示例

闭包函数示例



局部函数和闭包函数之间存在着密切的联系,同时也有一些本质的区别。

局部函数与闭包函数的关联

局部函数(Nested Function)

也称嵌套函数,指的是在另一个函数内部定义的函数。它作为外部函数的一部分,只能在外部函数的上下文中被调用和访问。

局部函数可以访问外部函数的局部变量和参数,但通常情况下,一旦外部函数执行完毕,这些局部变量就会被销毁。

闭包函数(Closure)

实际上是一种特殊类型的局部函数,它能够“记住”并访问其外部函数的局部变量和参数,即使在外部函数已经返回之后。

闭包的关键在于它维持了对外部变量的引用,从而能够在外部函数的生命周期结束后继续访问这些变量。

变量捕获与状态保留

局部函数通常不涉及对外部作用域变量的长期保留。它只是简单地借用外部变量的值进行计算或处理,当外部函数执行完毕,局部变量的生命周期也就结束了。

闭包函数通过创建一个引用链条,使得外部函数的局部变量不会被垃圾回收机制回收,即使外部函数已经执行完毕。这就允许闭包在后续的调用中继续访问和修改这些外部变量,从而实现了状态的保留。

应用场景的交集与差异

交集:两者都可以用来实现代码的模块化,通过将相关的操作封装在一起来提高代码的可读性和可维护性。局部函数和闭包函数都能帮助程序员更好地组织代码结构,减少全局变量的使用,从而降低命名冲突的风险。

差异:闭包特别适用于需要在不同时间点访问和修改共享状态的场景,如计数器、缓存管理、装饰器等。而局部函数更多用于逻辑分段,将大块的代码分解为更小、更易于管理的部分,不一定涉及状态的持久化。

闭包的本质

闭包可以视为局部函数的一种扩展,它利用了作用域链和变量生命周期的特性,提供了一种在函数间传递状态和数据的方式。闭包的核心价值在于它打破了常规的变量作用域限制,使得函数可以拥有“记忆”,这在函数式编程和某些特定的设计模式中极为有用。

局部函数示例

这里我们定义一个函数,该函数内部包含一个局部函数,用于执行某个特定计算任务,但不涉及状态的保留。

def outer_function(x):"""这是一个包含局部函数的外部函数。它定义了一个局部函数inner_function来执行计算。"""def inner_function(y):"""这是一个局部函数,用于计算x和y的和。"""return x + y  # 访问了外部函数的变量x,并与传入的y相加result = inner_function(10)  # 调用局部函数并传递参数return result# 调用外部函数
output = outer_function(5)
print(output)  # 输出结果为15

在这个例子中,inner_function是一个局部函数,它只能在outer_function内部被访问和调用。它能够访问外部函数outer_function的参数x,但是当outer_function执行完毕后,inner_function就不再可用。

闭包函数示例

通过一个闭包的例子来展示如何在函数执行结束后仍然保留对外部变量的访问。

def counter_factory(start):"""这个工厂函数返回一个闭包函数。闭包函数能够记住start的值,并在此基础上进行计数。"""count = start  # 这个变量被闭包记住def counter():"""闭包函数,每次调用都返回递增的计数。"""nonlocal countcount += 1return countreturn counter  # 注意这里返回的是counter函数本身,而不是调用它# 创建一个从1开始的计数器
counter1 = counter_factory(1)print(counter1())  # 输出2
print(counter1())  # 输出3
print(counter1())  # 输出4# 创建另一个从10开始的计数器,演示闭包独立保存状态的能力
counter2 = counter_factory(10)print(counter2())  # 输出11
print(counter2())  # 输出12

图片

在这个例子中,counter_factory函数返回了一个闭包函数counter。虽然counter函数在counter_factory执行完毕后仍然可用,但它“记得”了创建时start的值,并且每次调用都会基于这个初始值进行计数,展示了闭包的“记忆”特性。每个由counter_factory创建的闭包实例都保留了自己的状态,互不影响。

字典键值对找不到?Python魔法方法__missing__来帮你!-CSDN博客
Humanize,一个很有人情味的 Python 库_python humanize-CSDN博客
Python自定义接口,也能玩得这么花-CSDN博客

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

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

相关文章

(八)ReactHooks使用规则

ReactHooks使用规则 只能在组件中或者其他自定义Hook函数中使用只能在组件的顶层调用,不能嵌套在if、for、其他函数中

Windows 11 安装hp 1020 plus 打印机驱动 (Ubuntu 20.04.3 LTS 部署cups局域网共享打印服务器)

1 win11 下载HP laserjet 1020 plus驱动,可以官网下载哦 链接下载 2 手动添加hp laserjet 1020驱动: 控制面板-->查看设备和打印机-->打印机和扫描仪-->添加设备-->我需要的打印机不在列表中-->通过手动添加-->按名称选择共享打印机 如果找不到&#xff0…

Android应用保活实践

} override fun onBind(intent: Intent): IBinder? { return mBilder } override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { //播放无声音乐 if (mediaPlayer null) { mediaPlayer MediaPlayer.create(this, R.raw.novioce) //声音设置为0 me…

Spring MVC拦截器、文件上传和全局异常处理

目录 1.拦截器1.1.什么是拦截器?1.2 拦截器的API1.3 拦截器的执行顺序1.5 自定义拦截器1.5 登录拦截器案例 2.文件上传2.1 添加依赖2.2 配置文件上传解析器2.3 编写控制器2.4 编写jsp页面2.5 注意事项 3.全局异常处理器3.1 异常处理思路3.2 创建异常处理器3.3 编写异…

FlinkCDC sink paimon 暂不支持exactly-once写入,而通过 幂等写

幂等写入: 一个幂等操作无论执行多少次都会返回同样的结果。例如,重复的向hashmap中插入同样的key-value对就是幂等操作,因为头一次插入操作之后所有的插入操作都不会改变这个hashmap,因为hashmap已经包含这个key-value对了。另一…

vuejs3用gsap实现动画

效果 gsap官网地址&#xff1a; https://gsap.com/ 安装gsap npm i gsap 创建Gsap.vue文件 <script setup> import {reactive, watch} from "vue"; import gsap from "gsap"; const props defineProps({value:{type:Number,default:0} }) cons…

FFmpeg编译4

CPUx86-64 TOOLCHAIN N D K / t o o l c h a i n s / x 8 6 6 4 − 4.9 / p r e b u i l t / l i n u x − x 8 6 6 4 S Y S R O O T NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64 SYSROOT NDK/toolchains/x866​4−4.9/prebuilt/linux−x866​4SYSROOTNDK/platforms/and…

Java | Leetcode Java题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; class Solution {public int calculateMinimumHP(int[][] dungeon) {int n dungeon.length, m dungeon[0].length;int[][] dp new int[n 1][m 1];for (int i 0; i < n; i) {Arrays.fill(dp[i], Integer.MAX_VALUE);}dp[n][m - 1] …

QML 实现上浮后消失的提示框

基本效果&#xff1a;上浮逐渐显示&#xff0c;短暂停留后上浮逐渐消失 为了能同时显示多个提示框&#xff0c;一是需要动态创建每个弹框 Item&#xff0c;二是弹出位置问题&#xff0c;如果是底部为基准位置就把已经弹出的往上移动。 效果展示&#xff1a; 主要实现代码&…

46、基于自组织映射神经网络的鸢尾花聚类(matlab)

1、自组织映射神经网络的鸢尾花聚类的原理及流程 自组织映射神经网络&#xff08;Self-Organizing Map, SOM&#xff09;是一种用于聚类和数据可视化的人工神经网络模型。在鸢尾花聚类中&#xff0c;SOM 可以用来将鸢尾花数据集分成不同的类别&#xff0c;同时保留数据间的拓扑…

动态规划——买卖股票的最佳时机含冷冻期

1、题目链接 leetcode 309. 买卖股票的最佳时机含冷冻期 2、题目分析 该题有我们可以定义三种状态&#xff0c;买入状态&#xff0c;可交易状态 &#xff0c;冷冻期状态 我们可以建立一个n*3的二维数组来表示这三种状态&#xff1a; 根据这个图可以看出&#xff0c; 可以从…

不到3毛钱的SOT23和SOT89封装18V耐压低功耗高PSRR高精度LDO稳压芯片ME6231电流0.5A电压3.3V和1.8V

前言 SOT23-5封装ME6231外观和丝印 一款国产LDO&#xff0c;某些场合&#xff0c;要把1117扔了吧&#xff0c;SOT23封装&#xff0c;虽然不是最小&#xff0c;但也是够小的了。 参考价格&#xff1a;约0.25元 概述 ME6231 系列是以 CMOS 工艺制造的 18V 耐压、低功耗、高 PSR…

2024-06-23 操作系统实验5——模拟页式存储管理

文章目录 一、实验目的二、实验内容三、实验过程四、结果测试五、实验总结和说明 补录与分享本科实验&#xff0c;以示纪念。 一、实验目的 通过编写和调试请求页式存储管理的模拟程序以加深对请求页式存储管理方案的理解。 二、实验内容 页面淘汰算法可采用FIFO置换算法&a…

从理论到实践掌握UML

统一建模语言&#xff08;UML&#xff09;是软件工程师用来设计软件系统的一种工具&#xff0c;就像是一套图形化的说明书。它让开发团队能够以图形化的方式来理解、设计和开发软件系统&#xff0c;比起用文字来描述&#xff0c;更加直观易懂。本文通过UML实例化的理论和实践相…

ROS | 常见故障排查

1.开启后发出一个WIFI WIFI名字&#xff1a;WHEELTEC接数字 安全密钥&#xff1a;dongguan 2.显示屏接口 USB接口接键鼠 3.远程登录命令 ssh -Y wheeltec192.168.0.100 是小车发出的WIFI的一个IP地址 4. 登录后确保IP地址 ip a 看一下 当前ip地址 倒数第四行-当前ip地址 1…

django学习入门系列之第三点《CSS基础样式介绍3》

文章目录 浮动什么是浮动浮动的特性清除浮动 往期回顾 浮动 什么是浮动 float属性用于创建浮动框&#xff0c;将其移动到一边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框的边缘。 浮动的特性 浮动元素会脱离标准流(脱标) 浮动的元素会一行内显示并且元素顶部对…

51单片机STC89C52RC——6.3 定时器/计数器 实现计时功能(定时器+中断系统+LCD1602液晶显示器)

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;定时器 中断系统LCD1602显示 三&#xff0c;创建Keil项目 四&#xff0c;代码 五&#xff0c;代码编译、下载到51单片机 ​ 目的/效果 用定时器实现系统中断&#xff0c;计时信息显示在LCD1602上。效果如下 …

springAI(一)

目录 一、spring AI 目的 二、spring AI 来源 三、sprig AI 是什么&#xff1f; 四、spring AI中的 概念 4.1、模型&#xff08;Models&#xff09; 4.2、提示&#xff08;Prompts&#xff09; 4.3、提示模板&#xff08;Prompt Templates&#xff09; 4.4、令 牌&#…

Axios-入门

介绍 Axios对原生Ajax进行了封装&#xff0c;简化书写&#xff0c;快速开发 官网&#xff1a;Axios中文文档 | Axios中文网 (axios-http.cn) 入门 1引入Axios的js文件 <script src"js/axios.js"></script> 2使用Axios发送请求&#xff0c;并获取响应…

系统架构师考点--嵌入式技术

​大家好。今天来总结一下嵌入式技术的考点。该考点分值3-5分&#xff0c;上午场选择题和下午场案例题都可能会考&#xff0c;但不是每年都考。 一、嵌入式微处理体系结构 冯诺依曼结构&#xff1a;传统计算机采用冯诺依曼(Von Neumann)结构&#xff0c;也称普林斯顿结构是一…