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	# 访问外部函数的参数——这里是x
    
    return 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	# 访问外部函数的参数——这里是x
    
    return 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gan实战(DCGAN、)

一、DCGAN 1.1 参数 (1)输入:会被放缩到6464 (2)输出:6464 (3)数据集: 1.2 实现 import glob import torch from PIL import Image from torch import nn from torch.u…

web前端框架——Vue的特性

目录 前言: 一.vue 二.特性 1.轻量级 2.数据绑定 3.指令 4.插件 三.比较Angular 、React 、Vue 框架之间的比较 1. Angular Angular的优点: 2. React React 的优点: 3.vue 3.Vue的优点: 前言: 本篇文章…

有效的括号长按键入验证外星语词典字符的最短距离用栈实现队列

有效的括号来源&#xff1a;杭哥20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09;bool isValid(char * s) {int szstrlen(s);char stack[sz];int k0;for (int i0;i<sz;i){if (s[i]( || s[i][ || s[i]{){stack[k]s[i];}else{if (k0){return false;}else if (s[i]} &am…

C++ Qt自建网页浏览器

C Qt自建网页浏览器如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<C Qt自建网页浏览器>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。文…

VSCode嵌入式开发环境搭建

Vscode开发环境搭建 看这个链接就可以了&#xff0c;后面下载调试有点问题看下3.3。 在VSCode上部署STM32F1的开发环境 1. MXCube配置工程生成Makefile文件 借助正确的编译工具链进行编译&#xff0c; 2. 编译工具链搭建 编译工具链使用GCC的ARM版本 arm-none-eabi-gcc &am…

servlet

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录Servlet 是什么第一个 Servlet 程序1.创建项目2.引入依赖3.创建目录结构4.编写代码5.打包程序6.部署程序7.验证更方便的部署方…

【Linux】基础IO(一) :文件描述符,文件流指针,重定向

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 码字不易&#xff0c;请多多支持&#x1f618;&#x1f618; 这是目录重新认识文件系统内部的文件操作我们C语言的文件操作系统内部的文件操作OS一般会如何让用户给自己传递标志位的&#x…

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

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

Dubbo的独门绝技,SPI实现原理分析

文章目录前言普通SPI实现原理实例化扩展点源码分析扩展点加载流程分析LoadingStrategy分析接口定义接口实现加载原理loadClass方法分析自适应SPI实现原理自适应扩展代码生成分析自激活SPI简单使用原理分析Activate注解源码分析IOC实现原理objectFactory介绍总结AOP实现原理总结…

Chapter7.1:频域分析法理论基础

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…

JS 处理后台返回的数据

前言 常规情况下&#xff0c;我们可以把后台返回给我们的数据直接渲染在前台页面上&#xff0c;但不排除一些特殊的情况需要我们对源数据进行处理&#xff0c;例如 element 上传组件&#xff0c;在编辑页面中的回显指定参数为 name 和 url&#xff0c;但是后台返回的如果不是这…

【MySQL】1 MySQL的下载、安装与配置|提供安装包

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 目前,已开了以下专栏,欢迎关注与指导 1️⃣Java基础知识系统学习(持续更文中…) 2️⃣UML(已更完) 3️⃣MySQL(持续更文中…) MYSQL的下载、安装与配置1.下载MySQL5.71.1安装包的获…

C++入门教程||C++ 数字||C++ 数组

C 数字通常&#xff0c;当我们需要用到数字时&#xff0c;我们会使用原始的数据类型&#xff0c;如 int、short、long、float 和 double 等等。这些用于数字的数据类型&#xff0c;其可能的值和数值范围&#xff0c;我们已经在 C 数据类型一章中讨论过。C 定义数字我们已经在之…

NSSCTF-[NCTF 2021]狗狗的秘密

题目链接&#xff1a;NSSCTF 根据题目标签&#xff0c;这道题考了SMC&#xff0c;xtea和base47。 无壳&#xff0c;载入IDA&#xff0c;看main函数可知输入长度是42。然后创造了新线程&#xff0c;进入线程开始地址StartAddress。 是一个赋值语句就没别的了&#xff0c;很迷。…

【5G RRC】NR测量事件介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【STL四】序列容器——vector容器

【STL容器】序列容器——vector容器一、简介二、头文件三、模板类四、成员函数1、迭代器2、元素访问3、容量4、修改操作五、demo1、容量reserve、capacity、shrink_to_fit2、修改操作pop_back()、push_back3、修改操作insert()4、修改操作emplace()5、修改操作erase()、swap()、…

202209-3 CCF 防疫大数据 满分题解(超详细讲解 + 注释代码) + 解题思路(STL模拟)

问题描述 解题思路 首先题意是给出n天的漫游信息以及n天的风险地区名单 求n天的风险人群 根据题意肯定要将漫游信息存储下来&#xff0c;用结构体数组比较合适 在判断该用户是否是风险人群时&#xff0c;需要判断[d1, d]区间内地点r是否是风险地区&#xff0c;所以需要把地点…

JAVA开发(自研项目的开发与推广)

https://live.csdn.net/v/284629 案例背景&#xff1a; 作为JAVA开发人员&#xff0c;我们可以开发无数多的web项目&#xff0c;电商系统&#xff0c;小程序&#xff0c;H5商城。有时候作为技术研发负责人&#xff0c;项目做成了有时候也需要对内进行内测&#xff0c;对外进行…

PHP+vue+elementUI高校食堂校园餐厅点餐系统

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 开发软件&#xff1a;hbuilderx/vscode/Dreamweaver/PhpSt…

项目管理工具哪个好?最新排名

项目管理工具当下已经成为项目团队的重要榜首&#xff0c;一款合适好用的项目管理工具可以帮助处理很多机械化工作&#xff0c;将管理者更多精力投入到更有价值的工作中&#xff0c;还可以帮助团队组织和计划项目&#xff0c;跟踪进度&#xff0c;处理预算和协作。该如何挑选帮…