【Python基础】闭包

文章目录

    • @[toc]
      • 函数引用
        • 示例
      • 什么是闭包
      • 闭包示例
        • 闭包的本质
        • 闭包带来的问题
      • 使用闭包修改外部函数中的变量
      • 闭包与对象的类比

函数引用

  • 在学习闭包之前,先来了解什么是函数引用
示例
def test():print('这是 test 函数的内部代码...')func_obj = testfunc_obj()
这是 test 函数的内部代码...
  • 上述代码定义了一个test()函数,使用一个变量func_obj保存了test()函数的引用(注意test不要加(),否则func_obj保存的是test()函数的返回值)

  • 此时func_obj保存了test()函数的引用,即func_obj指向了test()函数的代码块在内存中的地址,此时对func_obj进行调用,就是对func_obj所指向的代码块进行调用

  • 可以看到,调用func_obj()后打印了“这是 test 函数的内部代码…”

  • id()函数可以返回对象的唯一标识符,即对象的内存地址,使用id()函数可以查看此时test()函数和变量func_obj的内存地址

def test():print('这是 test 函数的内部代码...')func_obj = testfunc_obj()print(id(test))
print(id(func_obj))
这是 test 函数的内部代码...
1420657021424
1420657021424
  • 可以看到此时test()函数和变量func_obj指向同一个内存地址

什么是闭包

  • 在一些程序设计语言(例如Python)中,在函数中可以嵌套定义另一个函数,如果内部的函数引用了外部函数的变量,并且外部函数的返回值是内部函数的引用,此时被返回的内部函数引用称为闭包
  • 换句话说就是,当内部函数的引用被作为返回值返回时,携带了外部函数的变量的信息,就形成了一个闭包

闭包示例

def test(num):def wrapper():print(num)return wrapperfunc_obj = test(0)func_obj()
0
  • 上述代码在test()函数的内部定义了wrapper()函数,wrapper()函数引用了外部函数test()的变量numtest()wrapper()函数的引用作为返回值返回
  • 由于wrapper()函数引用了test()的变量num,调用test(0)时,test()函数将wrapper()函数的引用作为返回值返回的同时携带了变量num的信息
  • 然后调用func_obj(),打印了 0 0 0,此时运行了print(num)print(0)
闭包的本质
  • 函数在调用结束后,其参数和局部变量会被内存回收机制回收,无法再被访问
  • 闭包携带了包含它的函数的局部变量等信息,实际上是使包含它的函数的作用域在调用后不被内存回收机制所回收而保存在内存中,使闭包能够访问到这些局部变量等信息
闭包带来的问题
  • 由于闭包会携带包含它的函数的作用域,因此会比普通函数占用更多的内存

使用闭包修改外部函数中的变量

def counter(cnt):def add():# nonlocal 关键字用于在内层函数中访问并修改外层函数作用域中的变量nonlocal cntcnt += 1return cntreturn add# 创建一个闭包
func_obj = counter(1)print(func_obj())
print(func_obj())
2
3
  • 可以看到,变量cnt保存在内存中,闭包可以对cnt进行修改

闭包与对象的类比

  • 闭包与对象的功能很相似
  • 对象是属性 + + +方法,而闭包可以理解为数据 + + +功能,数据来源于外部函数的局部变量和参数,闭包用于实现功能
  • 对象适合实现较复杂的功能,而闭包则更轻量

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

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

相关文章

被我们忽略的HttpSession线程安全问题

1. 背景 最近在读《Java concurrency in practice》(Java并发实战),其中1.4节提到了Java web的线程安全问题时有如下一段话: Servlets and JPSs, as well as servlet filters and objects stored in scoped containers like ServletContext and HttpSe…

用“价值”的视角来看安全:《构建新型网络形态下的网络空间安全体系》

作者简介: 懒大王敲代码,正在学习嵌入式方向有关课程stm32,网络编程,数据结构C/C等 今天给大家介绍《构建新型网络形态下的网络空间安全体系》这本书,希望大家能觉得实用! 欢迎大家点赞 👍 收藏…

【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)

系列文章目录 身躯已然冰封,灵魂仍旧火热 本文由睡觉待开机原创,未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步! 文章目录 系列文章目录前言题目链接(有需要…

阿里云部署k8s with kubesphere

阿里云ESC 创建实例 填入密码即可 云上的防火墙相关设置就是安全组 vpc 专有网络 划分私有ip 子网 vpc 隔离环境域 不同的vpc下 即使相同的子网也不互通 使用交换机继续划分子网 停止 释放 不收钱 k8s 服务器 4核8G*1 8核16G *2 git 创建凭证 pipeline 发邮箱 (p124)…

双指针算法(二)

三数之和 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重…

基于SpringBoot的蛋糕商城

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的蛋糕商城,java项目。 e…

Linux---Ubuntu软件安装

1. 软件安装的介绍 Ubuntu软件安装有两种方式: 离线安装(deb文件格式安装)在线安装(apt-get方式安装) 2. deb文件格式安装 是 Ubuntu 的安装包格式,可以使用 dpkg 命令进行软件的安装和卸载。 命令说明dpkg安装和卸载deb安装包 dpkg命令选项: 选项…

数字滤波器设计——Matlab实现数字信号处理<1>

目录 一.实验内容 二.代码分析 1.信号产生部分 2.利用傅立叶级数展开的方法&#xff0c;自由生成所需的x(t) 3.通过选择不同的采样间隔T&#xff08;分别选T>或<1/2fc&#xff09;&#xff0c;从x(t)获得相应的x(n) 3.对获得的不同x(n)分别作傅立叶变换&#xff0c…

2024年高效远程协同运维工具推荐

随着企业的不断发展以及变化&#xff0c;企业的内部IT环境也是日益复杂&#xff0c;一跨高效远程协同运维工具必不可少&#xff0c;不仅可以提高生产力&#xff0c;还能降低运营成本。这里就给大家推荐2024年高效远程协同运维工具。 高效远程协同运维工具应用场景 1、IT运维管…

openresty介绍、安装、使用

openresty介绍、安装、使用 1、openresty介绍2、openresty安装3、openresty使用 1、openresty介绍 OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台&#xff0c;其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极…

安卓端出现https请求失败(转)

背景# 某天早上&#xff0c;正在一个会议时&#xff0c;突然好几个同事被叫出去了&#xff1b;后面才知道&#xff0c;是有业务同事反馈到领导那里&#xff0c;我们app里面某个功能异常。 具体是这样&#xff0c;我们安卓版本的app是禁止截屏的&#xff08;应该是app里做了拦…

设计模式(三)-结构型模式(2)-桥接模式

一、为何需要桥接模式&#xff08;Bridge&#xff09;? 在软件设计中&#xff0c;存在有两个或多个不同维度的模块时&#xff0c;我们需要将这些模块使用到在一起&#xff0c;来实现一个完整的功能。所谓不同维度的意思就是这些模块所负责的职责是不同的&#xff0c;并且它们…

lua安装

lua安装 1.Lua介绍 特点&#xff1a;轻量、小巧。C语言开发。开源。 设计的目的&#xff1a;嵌入到应用程序当中&#xff0c;提供灵活的扩展和定制化的功能。 luanginx&#xff0c;luaredis。 2.windows安装lua windows上安装lua&#xff1a; 检查机器上是否有lua C:\U…

【《漫画算法》笔记】找数组中出现奇数次的元素

给定数组&#xff0c;只有一个元素出现过奇数次 思路&#xff1a; 考虑到异或运算的性质——两个等值数的异或结果等于0&#xff0c;两个不等值的数异或结果为1&#xff0c; 将给定数组的所有元素异或起来&#xff0c;最终结果就是那个“唯一出现过计数次”的数。 给定数组&a…

10129 - Play on Words (UVA)

题目链接如下&#xff1a; Online Judge 欧拉道路的题。 有向图满足欧拉道路有两个条件&#xff1a;1&#xff0c;图是连通的&#xff08;无向边意义上&#xff09;&#xff1b;2&#xff0c;最多只能有两个点的出度不等于入度&#xff0c;而且其中一个点的出度比入度大1&am…

Kubernetes 的用法和解析 -- 4

一.Deployment 资源详解 如果Pod出现故障&#xff0c;对应的服务也会挂掉&#xff0c;所以Kubernetes提供了一个Deployment的概念 &#xff0c;目的是让Kubernetes去管理一组Pod的副本&#xff0c;也就是副本集 &#xff0c;这样就能够保证一定数量的副本一直可用&#xff0c;…

概率论复习

第一章&#xff1a;随机概率及其概率 A和B相容就是 AB 空集 全概率公式与贝叶斯公式&#xff1a; 伯努利求概率&#xff1a; 第二章&#xff1a;一维随机变量及其分布&#xff1a; 离散型随机变量求分布律&#xff1a; 利用常规离散性分布求概率&#xff1a; 连续性随机变量…

华为OD试题四(字符串统计、计算误码率、计算最大乘积)

1. 字符串统计 题目描述&#xff1a; 给定两个字符集合&#xff0c;一个为全量字符集&#xff0c;一个为已占用字符集。 已占用的字符集中的字符不能再使用&#xff0c;要求输出剩余可用字符集。 输入描述&#xff1a; 1、输入为一个字符串&#xff0c;一定包含符号。前的为全…

记录每日LeetCode 746.使用最小花费爬楼梯 Java实现

题目描述&#xff1a; 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低…

Windows使用VNC Viewer远程桌面Ubuntu【内网穿透】

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…