http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2020/7/13 17:24:00
博文_关于python语言的闭包


前几年学习JavaScript语言时,首次接触到闭包的概念,虽然有教程和案例,始终没有弄明白,也不知该怎么用,这个问题一直困惑了我好几年,这两年因高中信息技术推python语言,没想到在学习python语言时,意外把闭包问题给弄明白了,借博客留点心得。 


闭包的应用场景,主要是装饰器的使用,可不修改原函数的情况下,给函数添加新功能代码,由于学习JavaScript没有进一步学习框架,一直没有使用需求,故一直不得其解。软件开发时,升级时有个原则,即开放封闭原则,意思是已经实现的代码是不允许修改的,但可以扩展! 


回归主题,先看看关于闭包的概念,教科书大概这么说:在一个函数里面定义一个函数,并且返回内部函数,内部函数还调用了外部函数的变量,这就是闭包!怎么样,晕不晕!当时,看了一个选号器的例子,也一直没搞明白,这次终于明白了,下面举个例子来说明,学过函数的可以看下来,如果没学过函数,不用往下看了,哈哈! 


首先,闭包是一种函数的应用,举个例子吧,如封装一个直线方程的函数(没什么实际意义,仅用来说明问题),我们知道直线方程y=a*x+b,假设a=10b=20,现在封装一个函数,执行并返回10*x+20的值 

def line(x):

    return 10*x+20

 函数line功能相当与数学直线函数y=10*x+20

 下面用闭包来写这个函数:

 def line_conf(a,b):

    def line(x):

           return a*x+b

    return line


 用闭包的概念来给你解释下,绝对晕,按闭包的概念:在一个函数line_conf里面定义一个函数line,并且返回内部函数line,内部函数还调用了外部函数的变量,即ab,这就是一个闭包,怎么样,晕吧!


 下面换个说法后,我瞬间明白了闭包的意义,上面的代码,在函数line_conf内定义函数line,且函数line调用line_conf传入的参数ab,注意这里函数line仅被定义,没有执行,然后line_conf函数立刻就将line函数return出来了,这样做的效果是相当于给函数line和变量ab指定了一个独立的空间,这么说吧,原来那个line函数(前面那个10*x+20),a=10b=20是写死的,而现在lineab被封闭在一个空间,随着传入不同的ab,执行一次line_conf相当于制造一个函数,这样可以配置出不同的直线函数。


 即执行line01=line_conf(10,20)line01得到的返回包括,一个line函数并a=10b=20,相当于line01函数为y=10*x+20

 再次执行line02=line_conf(10,40)line02得到的返回包括,一个line函数并a=10b=40,相当于line02函数为y=10*x+40

 这样用line_conf函数可以得到一系列的直线方程

 你可以自己验证,如

Print(line01(10))   à 120

Print(line01(20))   à 220

Print(line01(30))   à 320

 

Print(line02(10))   à 140

Print(line02(20))   à 240

Print(line02(30))   à 340

mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
请稍候,载入中。。。
公告
请稍候,载入中。。。
时间记忆
请稍候,载入中。。。
最新日志
请稍候,载入中。。。
最新评论
请稍候,载入中。。。
最新回复
请稍候,载入中。。。
我的好友
我的相册
站点信息
请稍候,载入中。。。
生活因感动而精彩,理想在创造中放飞
Powered by Oblog.