自学Python day5--------函数式编程(返回函数)
来源:互联网 发布:淘宝护肤品店铺 编辑:程序博客网 时间:2024/06/05 17:30
**
自学Python day5——–函数式编程(返回函数)
**
闭包概念:
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。有如下例子:
var n=999; function f1(){ alert(n); } f1(); // 999
另一方面,在函数外部自然无法读取函数内的局部变量。
function f1(){
var n=999;
}
alert(n); // error
一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
function f1(){
n=999;
}
f1();
alert(n); // 999
二、如何从外部读取局部变量?出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数。
function f1()
{
var n=999;
function f2()
{
alert(n); // 999
}
}
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的”链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
上一节代码中的f2函数,就是闭包。各种专业文献上的”闭包”(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成”定义在一个函数内部的函数”。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
////返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如下的Python例子:
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fsf1, f2, f3 = count()
在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。
你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是:
>>> f1()9>>> f2()9>>> f3()9
全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
大神解法(若一定要在闭包中引用循环变量):
def count(): fs = [] for i in range(1,4): def f(x): return lambda: x*x fs.append(f(i)) return fs #返回函数变量名的列表(3个循环创建的函数)f1,f2,f3 = count()
相当于用一个匿名函数来代替了一个内嵌函数
- 自学Python day5--------函数式编程(返回函数)
- 自学Python day5--------函数式编程(filter)
- 自学Python day5--------函数编程(偏函数)
- python函数式编程(二)返回函数、匿名函数
- 自学Python day4--------函数式编程
- python函数式编程之返回函数
- python返回函数/函数编程
- python自学笔记(6)--Python函数式编程、函数的装饰器、递归
- Python函数式编程(高阶函数 <map/reduce filter sorted> 返回函数 匿名函数 装饰器 偏函数)
- DAY5之Python复习内容:函数(部分)
- 【python学习笔记】函数式编程:返回函数
- Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数
- python函数式编程之返回函数、匿名函数、装饰器、偏函数学习
- 自学Python之函数
- python核心编程-函数返回值
- 【编程语言】Python 函数多值返回
- Python 函数式编程(高阶函数、把函数作为参数、map()函数、reduce()函数、filter()函数、自定义排序函数、函数返回函数、闭包、匿名函数、装饰器decorator)
- Python入门 第四天(函数式编程、map、reduce、filter、排序函数、函数返回函数、闭包、匿名函数lambda)
- JS的取经之路(一)
- apollo broker 启动流程
- hostname
- Python单元测试框架unittest简介
- iOS开发之App主题切换完整解决方案(Swift版)
- 自学Python day5--------函数式编程(返回函数)
- Linux中重要目录详解
- 贝塞尔曲线轨迹计算公式util
- NHibernate之旅(21):探索对象状态
- MySQL数据库之MyISAM与InnoDB的区别
- template.js —一款基于JS的模板引擎
- JAVA开发环境的配置步骤
- linux64位下无法编译c文件的解决方法
- Tomcat闪退