当前位置: 首页 > news >正文

Python嵌套函数(Nested function)和闭包(closure)

Python嵌套函数(Nested function)和闭包(closure)

闭包(closure)是建立在嵌套函数基础上的,是一种特殊的嵌套函数结构。

先看嵌套函数(Nested function)。

Python允许函数的嵌套定义,即在函数体中可以定义函数,内部的函数为嵌套函数(nested function),也叫内部函数(inner function)。

为了执行内部函数,必须调用外部函数。 如果不调用外部函数,内部函数将永远不会执行。不能直接调用内部函数,需要先调用外部函数,在调用内部函数,否则出错。

下面给出一个嵌套函数的示例源码:

def outer(x):	# 外部函数print("outer的x:{}".format(x))def inner(y):  # 内部函数print("inner的y:{}".format(y))print("x+y={}".format(x+y))inner(8)     #调用内部函数outer(20)  # #调用外部函数

运行测试如下:

典型的闭包(closure)结构

就是在一个外部函数中定义了一个内部函数,内部函数使用了外部函数的局部变量,并且外部函数的返回值是内部函数,这样就构成了一个闭包。

典型的闭包格式的描述:

 def 外层函数():
    外层局部变量
    def 内层函数():
        引用外层函数的局部变量

return 内层函数

将上例嵌套函数修改成闭包结构源码如下:

def outer(x):	# 外部函数print("outer的x:{}".format(x))def inner(y):	# 内部函数print("inner的y:{}".format(y))return x + y	# 访问外部函数的参数——这里是xreturn inner    	# 通过返回内部函数,实现外部引用——inner后没有括号()n = outer(20)	# 调用外部函数并传参,获取引用内部函数
m=n(8)	# 调用内部函数inner(y)并传参,原外部函数的参数继续存在
print(m)

运行测试如下:

一般而言,调用一个函数是加一个括号。

如果看见函数括号后还有一个括号,说明第一个函数(外部函数)返回了一个函数(内部函数),前面的括号是外部函数的,后面的括号是内部函数的。

现在,修改上面闭包结构源码调用部分:

def outer(x):	# 外部函数print("outer的x:{}".format(x))def inner(y):	# 内部函数print("inner的y:{}".format(y))return x + y	# 访问外部函数的参数——这里是xreturn inner    	# 通过返回内部函数,实现外部引用——inner后没有括号()k=outer(20)(8)
print(k)

运行测试如下:

一般情况下,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。

但是闭包是一种特殊情况,如果外部函数在结束的时候发现有自己变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数。

判断函数是否为闭包

可以通过__closure__ 属性来判断,返回的是一个元组,每一项都是闭包函数引用的外部变量,可以通过cell_contents 将被引用的变量打印(显示)出来。cell_contents解释了局部变量在脱离函数后仍然可以在函数之外被访问的原因,因为变量被存储在cell_contents中了。

示例源码如下,请留意__closure__、cell_contents的使用:

def outer(x):	# 外部函数def inner(y):	# 内部函数return x 	# 注意这里:将return x 改为 return y 再运行试试看return inner    	# inner后没有括号()n = outer(20)	# 调用外部函数#查看 __closure__ 的值
print(n.__closure__)#通过cell_contents 将被引用的变量打印出来
for line in n.__closure__:
print(line.cell_contents)

运行测试如下:

由此可知,闭包的特点是返回的函数还引用了外层函数的局部变量。

理解清楚闭包这个概念,对于理解 Python 中的一大利器“装饰器”有很大的帮助。因为装饰器本身就是闭包的一个应用。Python装饰器(Decorator)https://www.cnblogs.com/BlueSkyyj/p/8884245.html

 

进一步了解

python中闭包详解https://zhuanlan.zhihu.com/p/341376218
Python闭包(Closure) https://www.cnblogs.com/BlueSkyyj/p/8884236.html
嵌套函数和闭包https://zhuanlan.zhihu.com/p/152408838

相关文章:

Python嵌套函数(Nested function)和闭包(closure)

Python嵌套函数(Nested function)和闭包(closure) 闭包(closure)是建立在嵌套函数基础上的,是一种特殊的嵌套函数结构。 先看嵌套函数(Nested function)。 Python允许…...

【实战】React 必会第三方插件 —— Cron 表达式生成器(qnn-react-cron)

文章目录一、引子二、配置使用1.安装2.使用(1)直接调用(2)赋值到表单(Form)(3)自定义功能按钮(4)隐藏指定 Tab(5)其他三、常见问题及解…...

C# 教你如何终止Task线程

我们在多线程中通常使用一个bool IsExit类似的代码来控制是否线程的运行与终止,其实使用CancellationTokenSource来进行控制更为好用,下面我们将介绍CancellationTokenSource相关用法。C# 使用 CancellationTokenSource 终止线程使用CancellationTokenSo…...

整合SpringCache

整合SpringCache 1、引入依赖cache还有redis <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> </dependency>2、写配置 spring:cache:type: redis3、测试使用缓存 Cache…...

05 - 环境变量编程

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录1. 初识环境变量1.1 问题1.2 main函数&#xff08;默认进程入口&#xff09;1.3 什么是环境变量&#xff1f;1.4 环境表的构成1.5 思考2. 深…...

vue3后台管理系统

后面可参考下&#xff1a;vue系列&#xff08;三&#xff09;——手把手教你搭建一个vue3管理后台基础模板 以下代码项目gitee地址 文章目录1. 初始化前端项目初始化项目添加加载效果配置 vite.config.js2. 使用路由安装路由配置路由配置别名和跳转安装pathvite.config.jsjsco…...

掷骰子式的乐趣:探究C语言生成随机数的奥秘

掷骰子式的乐趣&#xff1a;探究C语言生成随机数的奥秘一、引言二、C标准库的rand函数三、srand函数的使用四、基于时间的种子生成五、高质量随机数的应用一、引言 C语言中生成随机数是一项非常重要的功能&#xff0c;因为许多现代应用程序需要使用随机数。随机数可以用于密码…...

一线大厂软件测试常见面试题1500问,背完直接拿捏面试官,

三、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的SE会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; 我…...

小迪安全day12WEB漏洞-SQL注入之简要SQL注入

小迪安全day12WEB漏洞-SQL注入之简要SQL注入 注入产生原理详细分析 可控变量带入数据库查询变量未存在过滤或过滤不严谨 连接符区分 and是sql语句连接符&#xff0c;&是uel参数连接符 and 11是注入语句&#xff0c; &是添加一个新变量 数据库内容 数据库A 网站…...

自动化测试学习(七)-正则表达式,你真的会用吗?

目录 一、正则表达式在python中如何使用 二、用正则表达式匹配更多模式 三、常用字符分类的缩写代码 总结 所谓正则表达式&#xff08;regex&#xff09;&#xff0c;就是一种模式匹配&#xff0c;学会用正则匹配&#xff0c;就可以达到事半功倍的效果。 一、正则表达式在…...

验证码——vue中后端返回的图片流如何显示

目录 前言 一、p调用接口获取验证码 canvas画布渲染&#xff1f; 二、后端返回图片&#xff08;图片流&#xff09;&#xff0c;前端显示 1.blob 2.arraybuffer 总结 前言 登录界面经常会有验证码&#xff0c;验证码的实现方式也有很多&#xff0c;我目前做过以下两种&…...

聚观早报 | 拼多多驳斥Google的指控;80%美国人工作将被AI影响

今日要闻&#xff1a;拼多多驳斥Google“恶意软件”的指控&#xff1b;80%美国人工作将被AI影响&#xff1b;iPhone 15 Pro设计图上热搜&#xff1b;贾扬清离职阿里投身AI大模型创业&#xff1b;OPPO Find X6 系列发布拼多多驳斥Google“恶意软件”的指控 3 月 21 日&#xff0…...

define,typedef,inline 的区别

define 1.用于在代码中创建宏定义&#xff0c;将一个标识符替换为一个表达式或语句。例如&#xff1a; #define PI 3.14159 #define SQUARE(x) ((x) * (x))这样&#xff0c;程序中所有出现的 PI 都将被替换为 3.14159&#xff0c;SQUARE(x) 则被替换成了 (x) * (x)。 使用 #…...

百度文心一言正式亮相

OpenAI 刚发布了 GPT-4&#xff0c;百度预热已久的人工智能生成式对话产品也终于亮相了。昨天下午&#xff0c;文心一言 (ERNIE Bot)—— 百度全新一代知识增强大语言模型、文心大模型家族的新成员&#xff0c;正式在百度总部 “挥手点江山” 会议室里发布。 发布会一开场&…...

使用Android架构模板

使用Android架构模板 项目介绍 为了方便开发者引入最新的Android架构组建进行开发&#xff0c;Google官方给我们引入了一个架构模板&#xff0c;方便我们快速进入开发。 github地址&#xff1a; https://github.com/android/architecture-templates 该模板遵循官方架构指南 …...

2023年天津市逆向re2.exe解析-比较难(超详细)

2023年天津市逆向re2.exe解析(较难) 1.拖进IDA里进行分析2.动态调试3.编写EXP脚本获取FLAG4.获得FLAG1.拖进IDA里进行分析 进入主程序查看伪代码 发现一个循环,根据行为初步判定为遍历输入的字符并对其ascii^7进行加密 初步判断sub_1400ab4ec为比较输入和flag的函数 跟进u…...

springboot: mybatis动态拼接sql查询条件

目录 需求01: 根据不同类型 查询不同的订单名, 1. 书写订单 类型转换方法 2. 使用方式: 3.. 构建条件构造器并进行查询, 传递查询参数 4. Mapper 写法 5. 最核心位置 xml位置 6. sql执行效果: 需求01: 根据不同类型 查询不同的订单名, 条件也是不同的, 需要复用sql…...

最优化算法 - 动态规划算法

动态规划算法简介 动态规划&#xff08;Dynamic programming&#xff09;是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题…...

springCloud学习【3】之Docker(1)

文章目录一 Docker环境准备1.1 应用部署的环境问题1.2 Docker简介1.3 Docker解决操作系统环境差异1.4 Docker和虚拟机的区别1.5 Docker架构1.5.1 镜像和容器1.5.2 DockerHub1.5.3 Docker架构1.5.4 Docker工作流1.6 Docker的安装和启动1.7 安装步骤1.8 启动Docker1.9 配置镜像加…...

难以置信,已经有人用 ChatGPT 做 Excel 报表了?

要问2023年初科技领域什么最火&#xff0c;那自然是 ChatGPT。 ChatGPT 由人工智能研究实验室 OpenAI 于2022年11月30日推出。上线短短5天&#xff0c;用户数量已突破100万&#xff0c;在今年2月份&#xff0c;用户数量已经突破1亿。 ChatGPT 是一个超级智能聊天机器人&#…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...