闭包通俗解释,Demo(Go Java Python)

news2024/11/28 0:43:30

闭包的概念

想象一下,你有一个包裹着变量的函数,就像是一个封闭的包裹。这个包裹里有一个变量,而这个函数(或包裹)本身就是一个完整的单元。当你把这个函数传递给其他地方,就像是把这个包裹传递出去。

这个包裹不仅包含函数的代码,还"包裹"着它的词法环境,也就是函数定义时所在的上下文,其中包含的变量。这就意味着在函数之外,你仍然可以访问和使用函数内的变量,就好像把这个包裹带到其他地方一样。这种行为就像是一个"封闭的包裹",因此被称为 "闭包"。

所以,闭包就好比是一个能够包含函数代码和其相关环境的封闭单元,而且可以在其定义的范围之外继续存在和生效。

应用场景 

闭包是有权访问另一个函数作用域变量的函数,常见方式是函数内部创建另一个函数

优点:减少代码量,使这些局部变量始终保存着内存中,避免使用全局变量

缺点:这些局部变量不会立即销毁,浪费内存

比如A函数入参有5个,在A函数的处理逻辑中还需要调用B函数和C函数,而且B函数和C函数也用到了比较多的入参,那么如果将B和C定义到了函数A之内,这些入参就可以省去,直接调用即可,

代码的可读性也比较强。

不同语言Demo

匿名函数的使用在 Go 语言中非常灵活,可以帮助简化代码结构和提高代码的可读性。

这三个示例分别演示了在Java、Python和Go中如何使用闭包来捕获外部变量并在闭包内部使用它们。闭包允许我们在不传递变量的情况下将函数及其上下文传递给其他部分,这在某些情况下非常有用。

Java:

import java.util.function.*;

public class ClosureExample {
    public static void main(String[] args) {
        int x = 10;
        
        // 使用Lambda表达式创建一个闭包
        IntSupplier closure = () -> x * 2;
        
        // 调用闭包
        int result = closure.getAsInt();
        
        System.out.println("结果:" + result);
    }
}

在这个Java示例中,我们使用IntSupplier接口创建了一个闭包 closure,它捕获了外部变量 x 的值并返回 x * 2。这个闭包可以在定义它的上下文之外使用。

Python:

def outer_function(x):
    def inner_function():
        return x * 2
    return inner_function

closure = outer_function(10)
result = closure()

print("结果:", result)

在这个Python示例中,我们定义了一个外部函数 outer_function,它接受一个参数 x,并返回一个内部函数 inner_functioninner_function 捕获了外部变量 x 的值并返回 x * 2。然后,我们通过调用 outer_function(10) 创建了一个闭包 closure,并调用它来获得结果。

Go:

package main

import "fmt"

func main() {
    x := 10
    
    // 创建一个闭包函数
    closure := func() int {
        return x * 2
    }
    
    // 调用闭包
    result := closure()
    
    fmt.Println("结果:", result)
}

在这个Go示例中,我们使用匿名函数创建了一个闭包 closure,它捕获了外部变量 x 的值并返回 x * 2。然后,我们调用闭包并打印结果。

这三个示例分别演示了在Java、Python和Go中如何使用闭包来捕获外部变量并在闭包内部使用它们。闭包允许我们在不传递变量的情况下将函数及其上下文传递给其他部分,这在某些情况下非常有用。

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

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

相关文章

【教3妹学编辑-算法题】H 指数

2哥 :3妹,早上好啊, 吃过早餐了没呢? 3妹:2哥早, 我早餐已经吃过了, 吃了油条、豆浆、牛肉饼、八宝粥…… 嗝…… 2哥:吃这么多, 看你都打嗝了,吃饭喝足,开始…

分享54个ASP.NET源码总有一个是你想要的

分享54个ASP.NET源码总有一个是你想要的 链接:https://pan.baidu.com/s/1khPzxtOFP0wUHpg7TBDitg?pwd8888 提取码:8888 项目名称 (ASP.Net)基于三层架构的企业信息管理系统 asp .net mvc编写的房产管理系统 asp.net core mvc 病人管理后台 asp.ne…

2023年【汽车驾驶员(中级)】最新解析及汽车驾驶员(中级)复审考试

题库来源:安全生产模拟考试一点通公众号小程序 汽车驾驶员(中级)最新解析考前必练!安全生产模拟考试一点通每个月更新汽车驾驶员(中级)复审考试题目及答案!多做几遍,其实通过汽车驾…

升级降级苹果手机iOS系统工具iMazing2024

像任何计算设备一样,iPhones和iPads偶尔也会出现问题。有时iOS会崩溃,你需要重新安装它,以确保你可以继续使用设备,而不会丢失任何数据。有时你会看到一个黑屏,你不能用你的设备做任何事情。有时iPhone或iPad会陷入循环…

安信可小安派AiPi 代码下载

安信可小安派AiPi 代码下载笔记记录 AiPi 代码下载(直接使用命令行操作,仅需要Type-C接口线即可) 在完成环境搭建,和代码编写前提下,使用Type-C接口线下载代码,当然可以自己使用usb-ttl串口线下载程序&am…

TextureView和SurfaceView

1、Surface Surface对应了一块屏幕的缓冲区,每一个window对应一个Surface,任何View都是画在Surface上的,传统的View共享一块屏幕缓冲区,所有的绘制都必须在UI线程上进行。 2、SurfaceView 顾名思义就是Surface的View,…

【机器学习】项目数据处理部分

文章目录 前言项目理解数据探索特征工程总结 前言 本文参考《阿里云天池大赛赛题解析》,拿到一个项目或者赛题,使用机器学习来进行预测分类,需要以下七个步骤: 项目(赛题)理解数据探索特征工程模型训练模…

归并排序——

之前我们学习过把两个有序数组合并再一起后任然有序,就叫归并; 那么,排序是否也可以把一个要排序的数组分割成两个有序的数组,然后归并,之后再拷贝回原数组,就实现了排序 但是怎么才能控制分割成的数组是有…

MediaPlayer

1、概念 MediaPlayer是Android原生的多媒体播放器,可以用它来实现本地或者在线音视频的播放。 2、MediaPlayer的状态 下面的图是官方给出的状态转换图,也可易理解为MediaPlayer的生命周期。 椭圆形:表示MediaPlayer的状态;弧形…

视频下载软件 Downie4 mac中文介绍

Downie mac是一款Mac平台上非常实用的视频下载工具。它支持下载各种视频网站上的视频,并且具有快速、稳定、易于使用的特点。 Downie支持下载各种视频网站上的视频,包括YouTube、Vimeo、Netflix、Hulu、Amazon等等。它具有快速、稳定的下载速度&#xff…

【PWN · heap | Off-By-One】Asis CTF 2016 b00ks

萌新进度太慢了,才真正开始heap,还是从简单的Off-By-One开始吧 前言 步入堆的学习。堆的知识复杂而多,于是想着由wiki从简单部分逐个啃。 b00ks是经典的堆上off-by-one漏洞题目。刚开始看很懵(因为确实连堆的管理机制都没有完全…

为什么多线程会带来性能问题?

为什么多线程会带来性能问题? 什么是性能问题 在上一篇中,我们已经学习了多线程带来的线程安全问题,但对于多线程而言,它不仅可能会带来线程安全问题,还有可能会带来性能问题,也许你会奇怪,我…

C生万物 | 从浅入深理解指针【第二部分】

C生万物 | 从浅入深理解指针【第二部分】 前言: 如果没有看过第一部分的话,推荐先看第一部分,然后再来看第二部分~~ 文章目录 C生万物 | 从浅入深理解指针【第二部分】前言:1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的…

很多年前负责的BPO业务

业务最多的时候大约有120人左右,后来这个部门就去掉了。只留了4个领导。原因是俺开发了一些系统,替代了这个部门的人工。 当时的一些文档 ,现在还保留着。 数据安全最重要:严格控制网络安全漏洞,防止业务数据泄密。为…

4.3 视图机制

4.3 视图机制的笔记整理: 视图的作用: 数据隔离:为不同的用户提供不同的数据视图,从而限制数据对象的可见范围。安全保护:通过视图隐藏敏感或保密的数据,使无权存取的用户无法直接看到这些数据,…

ruoyi vue前后端分离功能介绍

文章目录 内置功能:用户管理:部门管理:岗位管理:菜单管理:角色管理:字典管理:参数管理: 可以设置是否开启验证码功能通知公告:操作日志:登录日志:在线用户&am…

redis学习03

Redis持久化 RDB(Redis DataBase) RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。   实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上&#xff…

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果…

【趣味随笔】盘点仿生机器人都有哪些

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

Java JVM垃圾回收确定垃圾的两种方式,GC Root

文章目录 前言一、如何确定是垃圾?引用计数法根可达路径法 二、GC Root1、以下可作为GC Root对象2、判断可回收:GC Root不可达3、真正宣告对象死亡需经过两次标记过程(重要) 前言 对于Java两种确定对象为可回收的两种方式&#x…