python的闭包

news2024/11/23 3:12:03

一、介绍

Python 中的闭包(Closure)是指一个函数对象(称为内部函数)捕获并引用了其所在函数(称为外部函数)中的变量,即使外部函数已经执行完毕内部函数仍然可以访问和操作外部函数中的变量。闭包在函数式编程中具有重要的作用,可以用于实现许多有用的功能和模式。

要创建一个闭包,需要满足以下条件:

  1. 必须有一个内部函数。
  2. 内部函数必须引用外部函数中的变量。
  3. 外部函数必须返回内部函数。

二、实例

下面是一个简单的闭包示例:

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(10)
print(closure(5))  # 输出: 15

在上述示例中,outer_function 是一个外部函数,它接受一个参数 x。在 outer_function 中定义了一个内部函数 inner_function,它引用了外部函数中的变量 x。最后,outer_function 返回了内部函数 inner_function

通过调用 outer_function(10),我们得到了一个闭包 closure。闭包 closure 是内部函数 inner_function 的引用,它在捕获了外部函数中的变量 x 的同时保留了该变量的状态。当我们调用 closure(5) 时,实际上是在调用内部函数 inner_function,它使用了外部函数中的变量 x,并将参数 y 加到 x 上返回结果。

这里唯一的问题就是,当outer_function(5) 结束之后返回了closure,return 应该是把outer_function函数给关闭了,它的本地作用域也随之消失,为什么

  • closure(5)还能再次进入outer_function?
  • 并且还能再次从outer_function的本地作用域调用x+y

三、自由变量的作用域

关于第一个问题,涉及到自由变量作用域的问题下面会阐述,第二个问题,涉及到python的内部机制,这种内嵌函数会将变量存在内存中,并不会直接释放,可以参考闭包原理

全局变量,局部变量的概念大家都清楚,看下面的例子分别定义全局变量,局部变量,这里会打印全局变量a

a = 20 # 全局变量
def inner():
    print(a)

def outer():
    a = 10 # 局部变量
    inner() # 全局变量可以进当前inner函数

outer()

只在函数内部 定义局部变量,inner函数无法找到变量a

def inner():
    print(a)

def outer():
    a = 2   # 局部变量
    inner() # 如果不是内嵌函数,局部变量a的作用域进不了函数inner

outer()

 

 使用内嵌函数,打印变量a

a = 20
def outer():
    a = 10
    def inner(): #内嵌函数
        print(a) #自由变量a的优先级大于全局变量a,打印10
    return inner

result = outer() # 闭包
result()

此时变量a是一个自由变量, 自由变量(Free variables)是指在闭包中被内部函数引用但不是内部函数的参数或局部变量的变量。

在闭包中,自由变量的作用域如下:

  1. 外部函数作用域:自由变量在外部函数中定义,因此在外部函数内部的任何地方都可以访问和使用自由变量。

  2. 内部函数作用域:内部函数是闭包中实际执行的函数,它可以访问和使用外部函数的自由变量。

其他例子

def outer_function():
    x = 10
    def inner_function():
        print(x) # x的作用域在内部函数与外部函数
    inner_function()

outer_function()  # 输出 10

四、总结

闭包的一个重要特性是它可以记住外部函数中的状态。每次调用外部函数时,都会创建一个新的闭包,每个闭包都保留了自己的外部函数变量的状态。这使得闭包非常适合用于创建具有持久状态的函数,例如计数器、缓存等。

闭包在实际编程中具有广泛的应用,可以用于实现回调函数、装饰器、延迟计算等功能。通过利用闭包,可以更灵活地组织和管理代码。

参考:

python之闭包详解_闭包python_小蜗牛-笨笨的博客-CSDN博客

python---闭包_python闭包_最初的梦10的博客-CSDN博客

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

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

相关文章

当配置Windows系统下的docker配置了阿里云镜像后下载依然很慢时多配几个镜像可以改善问题

前情介绍:在以前的docker版本中只需配阿里云的镜像下载就很快了,但是下载了新版本docker in Windows后,置Windows系统下的docker配置了阿里云镜像后下载依然很慢时,之后多配几个镜像可以改善问题。 问题现象: 1、下载慢…

uniapp h5 竖向的swiper内嵌视频实现抖音短视频垂直切换,丝滑切换视频效果,无限数据加载不卡顿

一、项目背景:实现仿抖音短视频全屏视频播放、点赞、评论、上下切换视频、视频播放暂停、分页加载、上拉加载下一页、下拉加载上一页等功能。。。 二、前言:博主一开始一直想实现类似抖音进入页面自动播放当前视频,上下滑动切换之后播放当前…

移远通信推出新一代高算力智能模组SG885G-WF,为工业和消费级IoT应用带来全新性能标杆

2023年7月24日,全球领先的物联网整体解决方案供应商移远通信宣布,正式推出其新一代旗舰级安卓智能模组SG885G-WF。该智能模组具有高达48 TOPS 的AI综合算力、强大性能及丰富的多媒体功能,非常适用于需要高处理能力和多媒体功能的工业和消费者…

T113-S3-RTL8822CU模块驱动移植

目录 前言 一、驱动源码获取 二、源码编译 三、驱动模块加载测试 前言 在嵌入式系统开发中,移植外部硬件设备的驱动是一个常见的任务。本文将分享如何在全志平台上成功移植RTL8822CU无线模块的驱动,以实现无线网络功能。 提示:以下是本篇文…

(四)RabbitMQ高级特性(消费端限流、利用限流实现不公平分发、消息存活时间、优先级队列

Lison <dreamlison163.com>, v1.0.0, 2023.06.23 RabbitMQ高级特性&#xff08;消费端限流、利用限流实现不公平分发、消息存活时间、优先级队列 文章目录 RabbitMQ高级特性&#xff08;消费端限流、利用限流实现不公平分发、消息存活时间、优先级队列消费端限流利用限流…

(一)认识InfluxDB

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 1 章 认识InfluxDB 1.1 InfluxDB的使用场景 InfluxDB是一种时序数据库&#xff0c;时序数据库通常被用在监…

MySQL笔记——表的修改查询相关的命令操作

系列文章目录 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库&#xff0c;对MySQL数据库的简单操作&#xff0c;MySQL的外接应用程序使用说明 文章目录 系列文章目录 一 表的修改操作 1.1 修改表的名字 1.2 添加一列score 1.3 修改列名称 1.4 修改新增列的…

containerd

Containerd是一个开源的容器运行时&#xff08;Container Runtime&#xff09;&#xff0c;它是Kubernetes和Docker等容器平台的基础组件之一。它旨在提供容器的生命周期管理和基本的运行时功能&#xff0c;使得容器的创建、启动、停止、删除等操作变得简单且高效。 Container…

Apipost使用教程

Apipost是一款集API调试、生成文档、Mock、测试于一体的协同工具。单个工具可以同时满足接口测试、生成/分享文档、Mock、流程测试等功能&#xff0c;还有超实用的多人多角色间实时协作的功能。将前端、后端、测试三种角色串联起来&#xff0c;从而实现工作流程无缝衔接、提高研…

C#中简单Winform程序编译(待验证)

1、文件架构 2、MainWindow.xaml <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.…

vue中的异步请求Axios(个人学习笔记五)

目录 友情提醒第一章、传统的jQuery方式获取数据1.1&#xff09;后端controller层代码1.2&#xff09;传统的jQuery获取数据1.3&#xff09;使用vue对象和jQuery获取异步数据 第二章、使用Axios获取数据2.1&#xff09;axios简介2.2&#xff09;axios两种使用方式2.3&#xff0…

WEB:easyphp

背景知识 php弱类型比较 MD5碰撞 题目 进行代码审计 <?php highlight_file(__FILE__); $key1 0;//值赋值 $key2 0;$a $_GET[a];//get方法获取值 $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){ //a的值需要大于 60000…

Seaborn中怎样绘制双变量分布图?

两个变量的二元分布可视化也很有用。在 Seaborn中最简单的方法是使用 jointplot()函数&#xff0c;该函数可以创建一个多面板图形&#xff0c;比如散点图、二维直方图、核密度估计等&#xff0c;以显示两个变量之间的双变量关系及每个变量在单坐标轴上的单变量分布。 jointplo…

Linux--Block group

Block Group&#xff1a;ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相 同的结构组成。政府管理各区的例子 超级块&#xff08;Super Block&#xff09;&#xff1a;存放文件系统本身的结构信息。记录的信息主要有&#xff1a;bolck 和 inod…

App测试流程及测试点

1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间&#xff0c;一般测试时间为两三周&#xff08;即15个工作日&#xff09;&#xff0c;根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目排期。 1.3测试资源…

测试覆盖率 JVM 字节码测试运用 - 远程调试、测试覆盖、影子数据库

目录 前言&#xff1a; 简介 基础使用方式介绍 工具特性 前言&#xff1a; 在软件开发中&#xff0c;测试覆盖率是一个非常重要的指标&#xff0c;它表示代码中所有的测试用例是否都已经被覆盖到。JVM 字节码测试是一种比较新的测试方法&#xff0c;它可以对 JVM 字节码进…

【雕爷学编程】Arduino动手做(86)---4*4位 WS2812 全彩模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【Postman】Postman接口测试进阶用法详解:断言、全局与环境变量、关联、批量执行用例、读取外部文件实现参数化

文章目录 一、Postman断言1、断言位置2、Postman的常用断言3、操作实例 二、全局变量与环境变量1、二者区分2、设置全局变量3、设置环境变量 三、Postman接口关联1、概念2、操作步骤 四、批量执行测试用例1、操作步骤2、查看结果 五、读取外部文件实现参数化1、使用场景2、操作…

云服务器远程nacos服务注册失败/不健康Client not connected, current status:STARTING

文章目录 Nacos报错docker安装不用 docker安装 Nacos报错 docker安装 使用docker在云服务器安装Nacos之后出现Client not connected, current status:STARTING 使用docker 安装之后需要添加映射端口 docker run -e JAVA_OPTS"-Xms256m -Xmx256m"-e MODEstandalone…

7.24 作业

1.自己封装vector template<typename T> class Myverctor {T* first;T* last;T* end; public:Myverctor():first(NULL),last(NULL),end(NULL){}Myverctor(int num,T data):first(new T[num]){last end first num;for(int i 0;i<num;i) first[i] data;}Myverctor…