什么是闭包?(python)
闭包,又称闭包函数或闭合函数,和嵌套函数类似。不同之处在于,闭包函数的外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,便于反复调用。
def outer(out):
def inner(inn):
return inn ** out
# 返回inner函数
return inner
# 计算一个数的平方
square = outer(2)
# 计算一个数的立方
cube = outer(3)
# out=2,inn=2
print(square(2))
# out=3,inn=2
print(cube(2))
运行结果为
4
8
在上面程序中,外部函数 outer() 的返回值是函数 inner(),而不是一个具体的数值。
需要注意的是,在执行完 square = outer(2) 和 cube = outer(3) 后,外部函数 outer() 的参数 out 会和内部函数 inner 一起赋值给 square 和 cube,这样在之后调用 square(2) 或者 cube(2) 时,程序就能顺利地输出结果,而不会报错说参数 out 没有定义。
不信输出square试试看:
print(square)
结果为:
<function outer.<locals>.inner at 0x0000019CACBD41F8>
function表明square是一个函数。因为square包含了参数out和内部函数inner。0x0000019CACBD41F8是存放的地址。
使用闭包的好处
上面的程序,完全可以写成下面的形式:
def outer_rewrite(inn, out):
return inn ** out
但是,为什么不用这种方式呢?
使用闭包可以让程序更加简单易读。当函数需要反复调用时,差别就出来了。比如需要计算很多个数的平方,大家觉得下面那种方式更简洁呢?
# 不使用闭包
ex1 = outer_rewrite(inn1,2)
ex2 = outer_rewrite(inn2,2)
ex3 = outer_rewrite(inn3,2)
# 使用闭包
square = outer(2)
ex1 = square(inn1)
ex2 = square(inn2)
ex3 = square(inn3)
答案已经显而易见了。使用闭包比不适用闭包简洁得多。这也是闭包出现的原因。你,get到了么?
参考文献
[1] 什么是闭包,Python闭包(初学者必读),C语言中文网
什么是闭包?(python)的更多相关文章
- Python 简明教程 --- 22,Python 闭包与装饰器
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 当你选择了一种语言,意味着你还选择了一组技术.一个社区. 目录 本节我们来介绍闭包与装饰器. 闭包与 ...
- python教程与资料
网上有个人写的python快速教程,非常好.比看书好多了.猛击下面的链接地址 http://www.douban.com/group/topic/30008503/ python文档资料收集 pyth ...
- 【Python大系】Python快速教程
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- Python快速教程目录(转)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容 ...
- Python快速教程
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容 ...
- python基础教程
转自:http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html Python快速教程 作者:Vamei 出处:http://www.cn ...
- Python系列教程大汇总
Python初级教程 Python快速教程 (手册) Python基础01 Hello World! Python基础02 基本数据类型 Python基础03 序列 Python基础04 运算 Pyt ...
- Python入门学习(一)
看完了莫烦Python的视频,对于Python有了一点感觉,接下来打算把小甲鱼的视频啃完,附上学习网址:http://blog.fishc.com/category/python 小甲鱼的视频是从零基 ...
- Python全栈之路----目录
Module1 Python基本语法 Python全栈之路----编程基本情况介绍 Python全栈之路----常用数据类型--集合 Module2 数据类型.字符编码.文件操作 Python全栈之路 ...
随机推荐
- 【记录一个问题】android下opencl中的event.getProfilingInfo()测速时间并不准确
使用了类似的代码来做android下opencl的时间测试: cl::CommandQueue queue(context, devices[0], CL_QUEUE_PROFILING_ENABLE ...
- dataTaDataTable 详细教程
DataTable 选项说明 特性 jQueryUI:true/false:控制是否使用jqueryUI样式,需要引入jQueryUI的CSS autoWidth:true/false:控制Datat ...
- epoll(1)
#include<stdio.h> #include<fcntl.h> #include<unistd.h> #include<sys/epoll.h> ...
- String类-intern方法
1 package cn.itcast.p1.string.demo; 2 3 class StringObjectDemo { 4 public static void main(String[] ...
- 【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
问题描述 通过Azure Logic App(逻辑应用)实现无代码的处理JSON数据.但是如何获取Request Body中的一个属性值呢? 例如:如何来获取以下JSON结构中的 ObjectName ...
- python33day
内容回顾 概念 同步异步阻塞和非阻塞 同步阻塞:调用一个函数需要等待这个函数的执行结果,并且在执行这个函数的过程中CPU不工作 inp=input('>>>') 同步非阻塞:调用一个 ...
- Unity——日志打印工具
一.日志工具功能 封装Debug类,需要实现功能: 1.控制所有日志是否打印: 2.除了Log,Warning,Error外,给更多日志种类(不同颜色): 3.格式化打印日志: 4.不定参数,自动拼接 ...
- 从故纸堆里,回顾下Web技术的发展历程
通过对比这些年的计算机图书来让大家感受下前些年Web技术的发展历程. Web开发框架,目前是Spring Boot+JPA,我正好出过本书,从中大家能感受到现在的技术. <Spring Boot ...
- __rept__和__str__
最近一下子学了很多的知识点,导致我有点没反应过来,粗略的在草稿纸记了点自己的想法,趁休息的时间将它敲到博客里面去,免得丢失,这一篇写的挺废话的,有点啰嗦,本篇的重点是第二段程序后开始的总结和后面的几个 ...
- Vue 面试题
1.Vue父组件向子组件传递数据? 答:props传参 父组件 <child :list="list"></child> //在这里绑定list对象 子组件 ...