什么是闭包?(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全栈之路 ...
随机推荐
- 【刷题-LeetCode】221. Maximal Square
Maximal Square Given a 2D binary matrix filled with 0's and 1's, find the largest square containing ...
- 【记录一个问题】用毫无用处的方法解决了libtask的asm.S在ndk下编译的问题
昨天提到,libtask中的asm.S使用的是ARM 32位的语法,因此在ARM 64下无法编译通过. 于是查了一下资料,改写了一下汇编代码,使得可以在64位下编译通过.源码如下 #if define ...
- azure 控制台小工具
这个控制台往往被忽略.
- 从数组中找出第K大的数
利用改进的快排方法 public class QuickFindMaxKValue { public static void main(String[] args) { int[] a = {8, 3 ...
- Sentry 开发者贡献指南 - 什么是 Scope, 什么是 Hub?
当一个事件被捕获并发送到 Sentry 时,SDK 会将该事件数据与来自当前 scope 的额外信息合并.SDK 通常会在框架集成中为您自动管理 scope,您无需考虑它们.但是,您应该知道 scop ...
- javaObject—toString方法
1 package face_object; 2 /* 3 * Object:所有类的根类. 4 * Object是不断抽取而来的,具备所有对象都具备的共性内容. 5 * 常用的共性功能: 6 * 7 ...
- ☕【Java深层系列】「并发编程系列」深入分析和研究MappedByteBuffer的实现原理和开发指南
前言介绍 在Java编程语言中,操作文件IO的时候,通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于Mapp ...
- redis分析系列之set命令
前言 最近研究下redis源码,现在从最基本的命令行操作来分析,redis是如何处理命令操作的 1. redis的set命令操作 我们在redis-cli执行下面的命令 set c c debug 发 ...
- 边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解
花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...
- django入门 01 创建项目
安装django库 pip install django 创建--by 终端 django-admin startproject myproject 通过命令创建的django项目,默认不含templ ...