【Python总结】闭包及其应用

mac2022-06-30  35

闭包及其应用

1、闭包的概念

闭包的概念比较晦涩难以理解,我是这么定义闭包的:

闭包 是这样的函数,它嵌套在另一个函数中,并且由其所嵌套的函数返回该函数的引用。

下面通过一个具体的例子来理解闭包的概念

def line(a,b): def line_inner(x): return a*x+b print(line_inner) return line_inner

在这个例子中,函数line_inner(x)嵌套在函数line(a,b)中,并且,函数line(a,b)的返回值是函数line_inner的引用,这样的函数line_inner就是一个 闭包 。

闭包满足以下三个条件:

嵌套在函数里面闭包中的变量含有外部函数的参数外部函数的返回值是内部函数的引用

下面通过一行代码来看看返回的函数引用到底是神马

print(line(1,2))

输出结果是:

<function line.<locals>.line_inner at 0x000001F27AC82620>

可以看出,外部函数line返回的是内部函数line_inner的引用(内部的引用地址)

2、闭包的使用

那么,闭包怎么使用呢?

通过上面的例子,外部函数返回了内部函数的引用

要想使用闭包,就要利用返回的函数引用

把这个引用保留下来,就可以当做内部函数来使用了

line0 = print(line(1,2)) line0(3)

这样,就可以使用闭包了

3、闭包的应用

看起来闭包比一般的函数还要复杂,难以理解

那么,还为什么要学习闭包呢?

因为,闭包在数据处理方面高效便捷性就体现出来了

下面举个例子:

如果想计算:y = a * x + b 的值

利用一般函数计算要传递三个参数

并且,当要计算多组值时就变得非常繁琐

但是,利用闭包来计算就非常简便

利用闭包计算 y = a * x + b 代码如下:

def line(a,b): def line_inner(x): return a*x+b return line_inner line1 = line(2,4) line2 = line(1,5) print("y=2x+4 当x=2时 值为:%d" % line1(2)) #计算2x+4 当x=2时的值 print("y=2x+4 当x=3时 值为:%d" % line1(3)) #计算2x+4 当x=3时的值 print("y=x+5 当x=2时 值为:%d" % line2(2)) #计算x+5 当x=2时的值 print("y=x+5 当x=3时 值为:%d" % line2(3)) #计算x+5 当x=3时的值

运行结果如图: 通过这样一个简单的例子,就能够体会到闭包在数值计算、处理上有着很大优势

可以应简单几行代码实现某个函数式的变量取不同值的多组值

【Python】相关技术文章: 【总结】Python与C语言、Java等语言基本语法的不同点 【总结】分析Python中的循环技巧 【总结】Python语言是编译型语言还是解释型语言?(Python程序执行过程) 【总结】Python2 和 Python3 的区别 利用Python一层循环打印 * 型三角形 【总结】Python与C语言、Java等语言基本语法的不同点 【总结】你知道吗?——元组其实是可变的序列! 【Python爬虫教程】Python爬虫基本流程及相关技术支持 【Python问题解决】PyCharm中debug报错:using cython not found. pydev debugger: process 13108 is connecting原因及解决

【Java Web】相关技术文章: 【Java Web总结】Java Web项目中 的.classpath、.mymetadata、.project文件作用 【Java Web问题解决】Tomcat报错javax.servlet.ServletException: Error instantiating servlet class.报错404 【比较】什么是“服务器端跳转”“客户端跳转”,二者有什么区别? 【总结】表单提交的get和post有什么不同? 【Java Web问题解决】Tomcat报错:java.lang.ClassCastException: ** cannot be cast to javax.servlet.Filter解决办法 【Java Web问题解决】Filter过滤器初始化方法init()执行了两次原因及解决方法 【总结】Java Web 中的4种属性范围(page、request、session、application) 【Java Web问题解决】Tomcat报错:java.sql.SQLException: No suitable driver found for jdbc:mysql://** 【Java Web问题解决】Tomcat启动时控制台出现中文乱码的问题解决方法 【示例项目】java实现通过身份证号码判断籍贯所在地区 【总结】HTTP协议中的状态码(200、403、404、500等) 【Java Web问题解决】提交表单后显示乱码原因及解决办法 【Java Web总结】JSP页面的生命周期详解 【Java Web总结】JSP页面实现类详解 【Java Web 问题解决】Tomcat启动失败 报错:Server Tomcat v9.0 Server at localhost failed to start. 【Java Web问题解决】连接数据库出错:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/ 【Java Web问题解决】使用过滤器Filter解决提交表单后显示乱码问题 【Java Web问题解决】过滤器Filter进行编码过滤后页面空白、显示不了原因及解决办法

【Linux 操作系统】相关技术文章: 【Linux问题解决】Ubuntu Linux 安装gcc4.9 g++4.9报错“没有可供安装的候选者”解决办法 【Linux教程】Ubuntu Linux 更换源教程 【Linux教程】如何实现在Ubuntu Linux和windows之间复制粘贴、拖拽复制文件? 【Linux问题解决】操作系统用C语言多线程编程 对‘pthread_create’未定义的引用 报错解决办法 【Linux教程】Linux中用C语言多线程编程之pthread_join()函数 【Linux操作系统、C语言】在Linux中用C语言进行OpenMP并行程序设计之常见指令、库函数和指令总结

最新回复(0)