Python闭包Closure 2
由于Python中,变量作用域为LEGB,所以在函数内部可以读取外部变量,但是在函数外不能读取函数内的变量。但是出于种种原因,我们需要读取函数内的变量时候怎么办?那就是在函数内在加一个函数。
def outer():
x = 5
def inner():
print(x)
return inner a = outer()
a()#print 5
这样,我们就可以看到函数内部的变量了。
上面的inner就是闭包,闭包就是能够读取其他函数内部变量的函数,也就是定义在函数内部的函数,在本质上来说,闭包就是连接函数内和函数外的桥梁。同时,闭包也可以理解为可以携带状态的函数,可以用这个特性构建类似于类private变量,携带状态的回调函数等。
闭包有两大作用,一个是像上面的可以读取函数内部的变量,一个是让这些变量的值始终保存在内存中。
def outer():
n = 999
def tr():
nonlocal n
n = n+1
def inner():
print(n)
return tr,inner tr,a = outer()
a()#print999
tr()
a()#print1000
因为outer为inner的父函数,而inner被赋值给了一个全局变量,这导致inner和inner依赖的outer常驻内存
需要注意的是,返回的函数并没有立马执行,直到调用时候才开始执行。
def outer():
acts = []
for i in range(5):
acts.append(lambda x:i**x)
return acts acts = outer()
for i in range(5):
print(acts[i](2))
#
#
#
#
#
输出为五个16而不是我们想要的结果,为什么?
就是因为act[i]在内存中一直没有执行,一直等到调用才开始执行的,那怎么办?
方法就是用函数的参数绑定循环变量的值,这样无论循环变量的值怎么改变,已经绑定到函数参数的值不会改变
def outer():
acts = []
for i in range(5):
acts.append(lambda x,i=i:i**x)
return acts acts = outer()
for i in range(5):
print(acts[i](2))
#
#
#
#
#
使用闭包时候要注意:
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
参考资料:学习javascript闭包
Python学习手册p431
Python Cookbook
Python闭包Closure 2的更多相关文章
- python 闭包(closure)
闭包的定义: 闭包就是一个函数,这个函数可以记住封闭作用域里的值,而不管封闭作用域是否还在内存中. 来一个例子: def happy_add(a): print 'id(a): %x' % id(a) ...
- python闭包closure
在讨论闭包之前,先总结一下python的命名空间namespace,一般的语言都是通过namespace来识别名字标识,无论是变量,对象,函数等等.python划分3个名字空间层次,local:局部, ...
- python 闭包 Closure 函数作为返回值
一.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. >>> def lazy_sum(*args): ... def sum(): ... ax = ...
- python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)
1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...
- Python 闭包(Closure)
Python 闭包 (Closure) 这里介绍一下python 的闭包 基本概念 闭包(closure)是函数式编程的重要的语法结构. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函 ...
- 【Python】闭包Closure
原来这就是闭包啊... 还是上次面试,被问只不知掉js里面的闭包 闭包,没听过啊...什么是闭包 回来查了下,原来这货叫闭包啊...... —————————————————————————————— ...
- Python 闭包
什么是闭包? 闭包(closure)是词法闭包(lexical closure)的简称.闭包不是新奇的概念,而是早在高级程序语言开始发展的年代就已产生. 对闭包的理解大致分为两类,将闭包视为函数或者是 ...
- Python闭包与javascript闭包比较
实例一 python def line_conf(): def line(x): return 2*x+1 print(line(5)) # within the scope line_con ...
- Python闭包与函数对象
1. Python闭包是什么 在python中有函数闭包的概念,这个概念是什么意思呢,查看Wikipedia的说明如下: “ In programming languages, closures (a ...
随机推荐
- Linuc学习3-输入和输出重定向
已打开的文件描述符在fork和exec调用后保留下来,我们可以利用对进程这方面知识点的理解来改变程序的行为. 这个例子涉及一个过滤程序:它从标准输入读取数据,然后向标准输出写数据,同时在输入和输出之间 ...
- 【leetcode 简单】 第六十七题 回文链表
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...
- SolrJ案例实现搭建环境——(十五)
案例
- win10定时关机
CMD 输入shutdown -s -t 7200这个命令,大家可以自已设置7200这个时间,自己算一下60分钟=3600秒:
- javascript按照指定格式获取上一个月的日期
//get pre month//get pre month function getPreMonth() { var date=new Date().Format("yyyy-MM-dd& ...
- 使用Cache缓存
存放位置:服务器内存,用于频繁访问且不轻易更改的内容缓存. string CacheKey = "CT1"; //检索指定项, object objModel = Cache.Ge ...
- 洛谷P2149 Elaxia的路线
传送门啦 分析: 我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记.两边之后找两次都标记的边有多少就行了. 但...我并没有实现出来. 最后让我们看 ...
- ZOJ 3469 Food Delivery(区间DP好题)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4255 题目大意:在x轴上有n个客人,每个客人每分钟增加的愤怒值不同. ...
- python3项目之数据可视化
数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧密相关,而数据挖掘指的是使用代码来探索数据集的规律和关联. 数据科学家使用Python编写了一系列令人印象深刻的可视化和分析工具,其中很多也可供 ...
- ObjectInputStream与ObjectOutputStream
雇员类 package io; import java.io.Serializable; @SuppressWarnings("serial") public class Emp ...