深入理解Python闭包与递归:原理、应用与实践

目录
闭包
什么是闭包:
闭包的基本结构:
实现闭包的条件:
1.嵌套函数
2.内函数引用外部函数的变量
3.外部函数返回内部函数
4.外部函数已经执行完毕
递归函数
什么是递归函数:
递归函数条件
1.必须有个明确的结束条件 ———递归出口
2.每进行更深一步的递归,问题规模相比上一次递归都要有所减少
3.相邻两次重复之间有紧密联系
分析一下这段代码
1.函数定义:
2. 基准条件(Base Case)
3. 递归条件(Recursive Case)
典型的递归函数的例子
1到100的相加
2.斐波那契数列
递归的优缺点
优点
缺点
递归的应用场景
递归的注意事项
闭包
什么是闭包:
闭包是指在一个函数内部定义的函数,并且这个内部函数引用了外部函数的变量。即使外部函数已经执行完毕,内部函数仍然可以访问和操作这些变量
闭包的基本结构:
def outer_function(x):def inner_function(y):return x + yreturn inner_functionclosure = outer_function(10)
print(closure(5)) # 输出 15
接下来我为大家解释一下这段代码:
-
outer_function是外部函数,它接受一个参数x。 -
inner_function是内部函数,它接受一个参数y,并且引用了外部函数的变量x。 -
outer_function返回inner_function,而不是调用它。 -
当我们调用
outer_function(10)时,它返回inner_function,并且x被设置为10。 -
然后我们调用
closure(5),实际上是在调用inner_function(5),此时x仍然是10,所以结果是15
实现闭包的条件:
1.嵌套函数
闭包必须在一个外部函数中定义一个内部函数。也就是说,函数内部再定义一个函数。
def outer_function():def inner_function():passreturn inner_function
2.内函数引用外部函数的变量
内部函数必须引用外部函数的变量(即自由变量)。这是闭包的核心,内部函数通过引用外部函数的变量来“记住”外部函数的环境。
def outer_function(x):def inner_function(y):return x + y # 内部函数引用了外部函数的变量 xreturn inner_function
3.外部函数返回内部函数
外部函数必须返回内部函数(而不是调用它)。这样,内部函数可以在外部函数执行完毕后继续存在,并且仍然可以访问外部函数的变量。
def outer_function(x):def inner_function(y):return x + yreturn inner_function # 返回内部函数,而不是调用它closure = outer_function(10)
print(closure(5)) # 输出 15
4.外部函数已经执行完毕
闭包的特性在于,即使外部函数已经执行完毕,内部函数仍然可以访问外部函数的变量。这是因为闭包将外部函数的变量“捕获”并保存在内部函数的环境中。
def outer_function(x):def inner_function(y):return x + yreturn inner_functionclosure = outer_function(10) # 外部函数执行完毕,x 被设置为 10
print(closure(5)) # 内部函数仍然可以访问 x,输出 15
总结一下:
-
嵌套函数:在一个函数内部定义另一个函数。
-
内部函数引用外部函数的变量:内部函数必须引用外部函数的变量。
-
外部函数返回内部函数:外部函数返回内部函数,而不是调用它。
-
外部函数已经执行完毕:即使外部函数执行完毕,内部函数仍然可以访问外部函数的变量。
这些条件共同作用,使得闭包能够“记住”其定义时的环境,并在后续调用中继续使用这些环境中的变量。
递归函数
什么是递归函数:
递归函数(Recursive Function)是指在函数的定义中调用函数自身的函数。递归是一种强大的编程技术,特别适用于解决可以分解为相似子问题的问题。理解递归的概念和应用场景,可以帮助你编写更加简洁和优雅的代码。
递归函数条件
1.必须有个明确的结束条件 ———递归出口
2.每进行更深一步的递归,问题规模相比上一次递归都要有所减少
3.相邻两次重复之间有紧密联系
递归的基本结构
def recursive_function(parameters):if base_case_condition(parameters): # 基准条件return base_case_valueelse:# 递归条件return recursive_function(modified_parameters)
分析一下这段代码
1.函数定义:
-
recursive_function是一个递归函数,它接受一个或多个参数parameters。 -
参数
parameters是递归函数的输入,通常用于表示当前问题的状态或规模。
2. 基准条件(Base Case)
-
if base_case_condition(parameters):-
这是递归的终止条件。
-
base_case_condition(parameters)是一个判断条件,用于检查当前参数是否满足递归终止的条件。 -
如果满足基准条件,函数直接返回
base_case_value,不再进行递归调用。 -
基准条件的作用:防止无限递归,确保递归最终能够终止。
-
示例:
在这个例子中,n == 0 是基准条件,当 n 为 0 时,递归停止,函数返回 1
3. 递归条件(Recursive Case)
-
else:-
如果基准条件不满足,函数进入递归条件。
-
在递归条件中,函数会调用自身(即
recursive_function),但传入的参数会被修改(modified_parameters)。 -
修改参数的目的是将问题规模缩小,逐步逼近基准条件。
def factorial(n):if n == 0: # 基准条件return 1else: # 递归条件return n * factorial(n - 1)在这个例子中,
factorial(n - 1)是递归调用,每次递归调用时,n的值都会减小,逐步逼近基准条件n == 0。
-
典型的递归函数的例子
1.
1到100的相加
(一般方法)
# def add():
# s=0
# for i in range(1,101):
# s +=i
# print(s)
# add()
采用递归
# def add(n):
# if n ==1:
# return 1
#
# return n +add(n-1)
# print(add(100))
2.斐波那契数列
def fibonacci(n):if n == 0: # 基准条件return 0elif n == 1: # 基准条件return 1else:return fibonacci(n - 1) + fibonacci(n - 2) # 递归条件print(fibonacci(10)) # 输出 55
这个例子中:
-
当
n为0或1时,函数返回相应的基准值。 -
否则,函数返回
fibonacci(n - 1) + fibonacci(n - 2),即前两个斐波那契数的和。
递归的优缺点
优点
-
简洁性:递归代码通常比迭代代码更简洁和易读。
-
自然表达:对于某些问题(如树遍历、分治算法等),递归提供了一种自然的表达方式
缺点
-
性能问题:递归可能会导致大量的函数调用,增加栈的深度,从而影响性能。
-
栈溢出:如果递归深度过大,可能会导致栈溢出错误。
-
重复计算:在某些情况下(如斐波那契数列的简单递归实现),递归可能会导致大量的重复计算。
递归的应用场景
-
树和图的遍历:递归非常适合用于树和图的遍历(如深度优先搜索)。
-
分治算法:许多分治算法(如归并排序、快速排序)都使用递归来分解问题。
-
动态规划:递归常用于动态规划问题的初始实现,然后可以通过记忆化或迭代来优化。
递归的注意事项
-
确保基准条件正确:基准条件是递归终止的关键,必须确保它能够正确终止递归。
-
避免无限递归:如果递归条件没有正确地向基准条件靠近,可能会导致无限递归,最终导致栈溢出。
-
考虑性能问题:对于性能敏感的应用,可能需要将递归转换为迭代,或使用记忆化来优化递归。
总结一下: 递归函数是一种强大的编程工具,特别适用于解决可以分解为相似子问题的问题。理解递归的基本概念、优缺点和应用场景,可以帮助你编写更加简洁和优雅的代码。然而,递归也需要谨慎使用,特别是在性能敏感的应用中
相关文章:
深入理解Python闭包与递归:原理、应用与实践
目录 闭包 什么是闭包: 闭包的基本结构: 实现闭包的条件: 1.嵌套函数 2.内函数引用外部函数的变量 3.外部函数返回内部函数 4.外部函数已经执行完毕 递归函数 什么是递归函数: 递归函数条件 1.必须有个明确的结束条…...
第7章:Docker容器网络模型深度剖析
第7章:Docker容器网络模型深度剖析 作者:DogDog_Shuai 阅读时间:约30分钟 难度:高级 目录 1. 引言2. Docker网络架构3. Docker网络模式详解4. Docker网络配置5. Docker网络故障排查6. 总结1. 引言 Do...
SeaCMS代码审计
漏洞描述 漏洞分析 根据漏洞描述定位漏洞代码 当actionsaveCus或者save时,可以进行一个文件写入,不过文件类型被进行了限制,只有html,htm,js,txt,css 虽然这里并不能写入php文件,但是当actionadd或者custom时,这里进行…...
好看的网络安全登录页面 vue http网络安全
一、http协议 http协议是一种网络传输协议,规定了浏览器和服务器之间的通信方式。位于网络模型中的应用层。(盗图小灰。ヾ(◍∇◍)ノ゙) 但是,它的信息传输全部是以明文方式,不够安全,…...
springmvc中如何自定义入参注解并自动注入值
在Spring中,HandlerMethodArgumentResolver 是一个非常强大的接口,用于自定义控制器方法参数的解析逻辑。以下是一个完整的示例,展示如何使用 HandlerMethodArgumentResolver 并结合自定义注解来实现特定的参数解析逻辑。 ### **1. 定义自定…...
目标检测——清洗数据
清洗VOC格式数据集代码示例 import os import xml.etree.ElementTree as ETdef process_annotations(image_folder, annotation_folder):# 遍历标签文件夹中的所有XML文件for xml_file in os.listdir(annotation_folder):if not xml_file.endswith(.xml):continuexml_path os…...
numpy学习笔记7:np.dot(a, b) 详细解释
numpy学习笔记7:np.dot(a, b) 详细解释 np.dot(a, b) 函数详解 np.dot(a, b) 是 NumPy 中用于计算两个数组的点积或矩阵乘法的核心函数。其行为根据输入数组的维度不同而变化,以下是详细说明: 1. 输入为两个一维数组(向量&#…...
Unity--GPT-SoVITS接入、处理GPTAPI的SSE响应流
GPT-SoVITS GPT-SoVITS- v2(v3也可以,两者对模型文件具有兼容) 点击后 会进入新的游览器网页 ----- 看了一圈,发现主要问题集中在模型的训练很需要CPU,也就是模型的制作上,问题很多,如果有现有…...
Django初窥门径-Django REST Framework 基础使用
前言 在现代 Web 开发中,构建高效、安全且易于维护的 API 至关重要。Django REST framework(简称 DRF)作为 Django 生态中的强大工具,为开发者提供了创建 RESTful API 所需的完整解决方案。本文将详细介绍如何使用 Django 和 DRF 构建一个用户管理 API,涵盖环境配置、序列…...
LoRA中黑塞矩阵、Fisher信息矩阵是什么
LoRA中黑塞矩阵、Fisher信息矩阵是什么 1. 三者的核心概念 黑塞矩阵(Hessian) 二阶导数矩阵,用于优化问题中判断函数的凸性(如牛顿法),或计算参数更新方向(如拟牛顿法)。 Fisher信息矩阵(Fisher Information Matrix, FIM) 统计学中衡量参数估计的不确定性,反映数据…...
Redis哈希槽机制的实现
Redis哈希槽机制的实现 Redis集群使用哈希槽(Hash Slot)来管理数据分布,整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时,Redis会先对键进行哈希运算,得到一个哈希值。然后,Redis将该哈…...
docker pull 提示timeout
通过命令行拉取对应的mysql版本提示网络超时。 开始排查,首先确认是否能浏览器访问。ok的,可以正常访问。 终端curl 排查嗯 有问题 改了下 终端 vim ~/.zshrc 加入 export HTTP_PROXY"http://127.0.0.1:7890" export HTTPS_PROXY"…...
(超详细) ETL工具之Kettle
Kettle简介 kettle最早是一个开源的ETL工具,后命名为Pentaho Data Integration。由JAVA开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道,可对接包括传统数据库、文件、大数据平台、接口、流…...
Android第三次面试总结(网络篇)
在计算机网络领域,网络模型是理解通信原理的基础框架。本文将详细解析 OSI 参考模型和 TCP/IP 模型的分层结构、核心功能及实际应用,并通过对比帮助读者建立完整的知识体系。 一、OSI 参考模型:七层架构的理论基石 OSI(开放系统…...
国产编辑器EverEdit - Hex Dump插件:看到文本的另一面!
1 Hex Dump插件 1.1 应用场景 有时可能需要显示字母的ASCII编码,或其他文字的字节编码,可以使用Hex Dump插件来完成 1.2 使用方法 安装Hex Dump插件,安装插件方法参考:扩展管理 在编辑器中选中文本,选择扩展 -> …...
random_masking 函数测试
文章目录 1. description2. excel3. pytorch code 1. description 功能:按一定比例的随机部分样本,简单来说就是按照一定的比例将行向量从小到大的顺序提取出来。思考1: 用了均匀分布,并且按照一定比例,取前prob概率来…...
TDengine 中的流式计算
简介 TDengine 中的流计算,功能相当于简化版的 FLINK , 具有实时计算,计算结果可以输出到超级表中存储,同时也可用于窗口预计算,加快查询速度。 创建流式计算 CREATE STREAM [IF NOT EXISTS] stream_name [stream_o…...
Java 大视界 -- Java 大数据在智慧交通自动驾驶仿真与测试数据处理中的应用(136)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
k8s中的组件
1.namespace Namespace 用于将集群资源划分为不同的逻辑组,方便管理和隔离 kubectl get namespace 查看所有逻辑组 kubectl describe namespace <namespace-name> 查看某个逻辑组信息详情 kubectl create namespace ... 创建逻辑组 kubectl delete names…...
JVM的一些知识
JVM简介 JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别: VMw…...
【安全运营】用户与实体行为分析(UEBA)浅析
目录 用户与实体行为分析(UEBA)简介一、UEBA的核心概念1. 行为基线建立2. 异常检测3. 风险评分4. 上下文关联 二、UEBA的应用场景1. 内部威胁检测2. 外部威胁应对3. 合规性和审计支持 三、UEBA的技术实现1. 大数据技术2. 机器学习算法3. 可视化工具 四、…...
sql小记,20250319
ps:基于sqlserver 一、绩效管理系统表设计 1.表设计 Users用户表:包含id,用户名,密码。 AppraisalBases评价(职位基数)表:包含职位id,职位年终奖基数 AppraisalCoeffcients评价系数表:包含类别id, 类别&…...
C语言每日一练——day_7
引言 针对初学者,每日练习几个题,快速上手C语言。第七天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹
引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…...
C#的简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式是一种创建型设计模式,主要将对象的创建和使用分离,使得系统更加灵活和可维护。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式,以下是 C# 实现的三个案例: 简单工厂模式 简单工厂模式通过一个工厂类来创建…...
用hexo初始化博客执行hexo init时碰到的问题
用hexo初始化博客执行hexo init时碰到的问题 $ hexo init myblog INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git fatal: unable to access https://github.com/hexojs/hexo-starter.git/: SSL certificate problem: unable to get local issuer cer…...
4.1--入门知识扫盲,ISO知识体系介绍(看一遍,协议啥的全部记住)
OSI七层模型:网络世界的"七重天"生存指南(附快递小哥版图解) “如果你觉得网络分层很抽象,那就想象自己在寄快递” —— 来自一个被三次握手逼疯的程序员 开场白:网络通信就像送外卖 假设你要给隔壁妹子送奶…...
AI训练如何获取海量数据,论平台的重要性
引言:数据——AI时代的“新石油” 在人工智能和大模型技术飞速发展的今天,数据已成为驱动技术进步的 “ 燃料 ”。无论是训练聊天机器人、优化推荐算法,还是开发自动驾驶系统,都需要海量、多样化的数据支持。 然而,获…...
Axure高级功能深度解析一一高效原型设计的利器
Axure作为一款专业的原型设计工具,凭借其强大的功能和灵活的交互设计,成为了众多设计师和开发者的首选。本文将深入探讨Axure的高级功能,帮助大家更好地利用这款工具,提升原型设计的效率和质量。 一、Axure高级功能概览 • 变量管…...
QT国产化系统软件开发
一、国产操作系统 1、鸿蒙HarmonyOS NEXT 核心架构 采用自研鸿蒙内核,完全脱离Linux与AOSP代码,基于分布式架构实现跨设备资源虚拟化整合,支持动态调度多终端硬件能力。通过分布式软总线技术(D-Bus)实现低时延…...
