探探Java与python中的闭包
说在前面:在计算机科学中,闭包是指一个函数以及其引用的周围环境(变量)所组成的整体。简单来说,闭包允许一个函数访问并操作其外部函数作用域中的变量,即使外部函数已经执行完毕。

Java函数式编程—闭包(Closure)
何为闭包,闭包就是函数对象与外界变量绑定在一起,形成的整体。例如在Java中使用函数式编程实现一个闭包:
public class ClosureTest {interface Lambda {int add(int y);}public static void main(String[] args) {int x = 10;highOrder(y -> x + y);}static void highOrder(Lambda lambda) {System.out.println(lambda.add(20));}
}
- 代码中的 y -> x + y 和 x = 10,就形成了一个闭包
- 可以想象成,函数对象有个背包,背包里可以装变量随身携带,将来函数对象甭管传递到多远的地方,包里总装着个 x = 10
- 有个限制,局部变量 x 必须是 final 或 effective final 的,effective final 意思就是,虽然没有用 final 修饰,但就像是用 final 修饰了一样,不能重新赋值,否则就语法错误。
- 意味着闭包变量,在装进包里的那一刻,就不能变化了
- 道理也简单,为了保证函数的不变性,防止破坏成道
- 闭包是一种给函数执行提供数据的手段,函数执行既可以使用函数入参,还可以使用闭包变量
例:
public class ClosureTest {// 闭包作用:给函数对象提供参数以外的数据public static void main(String[] args) throws IOException {// 创建 10 个任务对象,并且每个任务对象给一个任务编号List<Runnable> list = new ArrayList<>();for (int i = 0; i < 10; i++) {int k = i + 1;Runnable task = () -> System.out.println(Thread.currentThread()+":执行任务" + k);list.add(task);}ExecutorService service = Executors.newVirtualThreadPerTaskExecutor();for (Runnable task : list) {service.submit(task);}System.in.read();}
}
Python闭包
在 Python 中,闭包是一个比较重要且有趣的概念。
当一个嵌套函数(函数里面的函数)引用了其外部函数的变量,并且外部函数返回了这个嵌套函数时,就形成了一个闭包。
简单来说,闭包使得函数能够记住并访问其定义时所在的环境(包括变量),即使外部函数已经执行完毕。
以下是一个简单的闭包示例:
def outer_function(x):def inner_function(y):return x + yreturn inner_functionclosure = outer_function(10)
print(closure(5))
在上述示例中,inner_function 就是一个闭包。它引用了外部函数 outer_function 的变量 x 。即使 outer_function 执行结束,inner_function 仍然能够记住并使用 x 的值。
闭包的主要优点包括:
实现数据隐藏和封装:外部无法直接访问闭包内引用的变量,增强了代码的安全性和封装性。
保存函数的状态:可以利用闭包来保存函数在不同调用之间的中间状态。
实现函数工厂:通过闭包可以创建一系列具有相似行为但又有细微差别的函数。
需要注意的是,在使用闭包时,如果对引用的外部变量进行修改,需要使用 nonlocal 关键字明确声明,否则会导致意外的结果。
闭包的缺点:
- 内存管理:由于闭包会保留对外部函数变量的引用,可能会导致内存泄漏问题。如果闭包被长时间引用而不释放,可能会占用大量内存。
- 变量作用域:在使用闭包时,要注意变量的作用域,避免意外的变量覆盖和冲突。
相关文章:
探探Java与python中的闭包
说在前面:在计算机科学中,闭包是指一个函数以及其引用的周围环境(变量)所组成的整体。简单来说,闭包允许一个函数访问并操作其外部函数作用域中的变量,即使外部函数已经执行完毕。 Java函数式编程—闭包&am…...
LD2 Scalable Heterophilous Graph Neural Network with Decoupled Embeddings
Neurips 24 推荐指数: #paper/⭐⭐⭐ 领域:可扩展图,大图加速 整个文章的理论部分比较多,尽量尽我所能避开一些额外公式。详细文章,见链接 模型架构 如图,整个模型分为与计算和训练两部分。本文的精华在于…...
【Mysql】Mysql数据库基本操作-------DDL(上)
1、DDL解释 DDL(Data Definition Language),数据定义语言,该语言部分包括以下内容, (1)对数据库的常用操作 (2)对表结构的常用操作 (3)修…...
MySQL知识点复习 - 常用的日志类型
MySQL中常用的日志类型: 重做日志(redo log) 作用:确保事务的持久性。redo日志记录事务执行后的状态,用来恢复还未写入data file的已成功事务更新的数据。防止在发生故障的时间点,尚有脏页未写入磁盘&…...
基于PHP+MySQL组合开发地方门户分类信息网站源码系统 带完整的安装代码包以及搭建部署教程
系统概述 随着互联网技术的飞速发展,地方门户分类信息网站逐渐成为城市生活不可或缺的一部分。它们涵盖了房产、招聘、二手交易、生活服务等多个领域,为当地居民提供了全方位的信息服务。为了满足这一市场需求,我们开发了这款基于PHPMySQL的…...
【1米C-SAR卫星】
1米C-SAR卫星 1米C-SAR卫星是我国自主研发的重要遥感卫星,主要用于海洋、陆地等观测任务,具备高分辨率、宽覆盖、多极化、多模式等特点。以下是对1米C-SAR卫星的详细介绍: 一、基本概况 发射时间:首颗1米C-SAR卫星于2021年11月2…...
【小小的脑袋,大大的疑问?】如何在Zookeeper中配置集群?
在Zookeeper中配置集群涉及多个步骤,以确保集群的稳定性和高效运行。以下是一个详细的配置流程: 一、环境准备 选择服务器: 选择合适数量的服务器,通常为奇数(如3台、5台等),以避免脑裂问题。确…...
Metasploit渗透测试之服务端漏洞利用
简介 在之前的文章中,我们学习了目标的IP地址,端口,服务,操作系统等信息的收集。信息收集过程中最大的收获是服务器或系统的操作系统信息。这些信息对后续的渗透目标机器非常有用,因为我们可以快速查找系统上运行的服…...
什么是原生IP?
代理IP的各个类型称呼有很多,且它们在网络使用和隐私保护方面扮演着不同的角色。今天将探讨什么是原生IP以及原生IP和住宅IP之间的区别,帮助大家更好地理解这两者的概念和实际应用,并选择适合自己的IP类型。 一、什么是原生IP? 原…...
【C++】unordered_map(set)
前言 C中的unordered容器(例如std::unordered_set、std::unordered_map等)底层是基于**哈希表(Hash Table)**实现的。哈希表是一种通过哈希函数将元素映射到特定“桶(bucket)”的容器,提供快速的…...
HTML 盒模型
盒模型(box model) 简介:盒模型(Box Model)是CSS中一个非常重要的概念,它定义了元素在网页上的布局和尺寸。 组成:内容(Content)、内边距(Paddingÿ…...
node.js npm 安装和安装create-next-app -windowsserver12
1、官网下载windows版本NODE.JS https://nodejs.org/dist/v20.17.0/node-v20.17.0-x64.msi 2、安装后增加两个文件夹目录node_global、node_cache npm config set prefix "C:\Program Files\nodejs\node_global" npm config set prefix "C:\Program Files\nod…...
Android13 展锐平台拨号中视频彩铃界面方向未与设备方向一致
背景:拨号中视频彩铃界面方向未与设备方向一致,要求视频彩铃界面方向与设备方向一致,修改视频彩铃显示的地方; 如图所示: 修改: packages/services/Telecomm/src/com/android/server/telecom/VideoProvid…...
为什么IP首部的源IP地址和目的IP地址不变而MAC层的源MAC地址和目的MAC地址变
IP首部的源IP地址和目的IP地址不变,而MAC层的源MAC地址和目的MAC地址变化的原因主要涉及到计算机网络中的分层结构和数据包传输过程。在OSI(开放系统互联)模型中,计算机网络被分为不同的层,每层都有其特定的功能。IP…...
Django 数据库配置以及字段设置详解
配置PostGre 要在 Django 中配置连接 PostgreSQL 数据库,并创建一个包含“使用人”和“车牌号”等字段的 Car 表 1. 配置 PostgreSQL 数据库连接 首先,在 Django 项目的 settings.py 中配置 PostgreSQL 连接。 修改 settings.py 文件: …...
C++ 左值右值引用梳理
C 左值右值引用梳理 左值与右值的区别 在参考资料上看到这样一句话 https://www.internalpointers.com/post/understanding-meaning-lvalues-and-rvalues-c In C an lvalue is something that points to a specific memory location. On the other hand, a rvalue is somethi…...
向量化技术在机器学习领域的深度实践与探索
向量化技术的魅力初现 在机器学习的广袤天地中,数据是驱动模型学习与进化的核心燃料。然而,面对海量、高维的数据,如何高效地进行处理与利用,成为了研究者们必须面对的问题。向量化技术应运而生,通过将文本、图像、音…...
RuoYi若依框架学习:多环境配置
在开发过程中,项目往往需要在不同的环境(如开发、测试和生产)中运行。RuoYi框架支持通过配置文件轻松实现多环境管理。以下是如何配置和使用多环境的技术分析。 1. 环境配置文件 RuoYi框架使用application-{profile}.yml文件来管理不同环境…...
Linux-RedHat7.4-服务器搭建FTP
Linux FTP 1、安装vsftpd和lftp: yum -y install vsftpd lftp ftp 2、创建用户: vsftpd提供了三种认证方式:本地用户、虚拟用户、匿名用户,本文介绍本地用户的认证方式。 注:本文创建的本地用户为只能访问ftp&…...
遍历递归数结构,修改里的disabled值
返回参数中新增字段 disabled,后端给的值为1和2, disabled1时,代表该节点需要置灰,不可选中 现在需要将disabled的值,改为布尔类型; 后端给的数结构是对象类型,tree接收数组类型; 先将对象类型的数据,遍历递归,修改里面的disabled值,最后再加[ ],改为…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
