Python 闭包使用注意点

作者: 编程鸭 | 来源:发表于2019-04-29 14:25 被阅读5次

1 Python 闭包

今天,聊下 python 的闭包。在函数编程中经常用到闭包。

闭包是什么,它是怎么产生的及用来解决什么问题呢。给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个参数a, 内层函数依旧传入一个参数b, 内层函数使用a和b, 最后返回内层函数)

结合实例代码进行解释。

在函数式编程语言中,函数是一等公民,函数可以作为另一个函数的参数或返回值可以赋给一个变量。函数可以嵌套定义,即在一个函数内部可以定义另一个函数。

In [4]: def extfunc(n):

  ...:    sum = n

  ...:    def intfunc():

  ...:        return sum+1

  ...:    return intfunc

  ...:     

  ...:                                                                       

In [5]: extfunc(20)                                                           

Out[5]: <function __main__.extfunc.<locals>.intfunc()>

In [6]: f = extfunc(20)                                                       

In [7]: f()                                                                   

Out[7]: 21

我们注意到一个问题:内嵌函数 intfunc中引用到外层函数中的局部变量sum,当我们调用分别由不同的参数调用 extfunc函数时,返回的函数是隔离的吗 ?

In [9]: f2 = extfunc(100)                                                     

In [10]: f2()                                                                 

Out[10]: 101

是隔离的。也就是说,每次调用 extfunc 函数后都将生成并保存一个新的局部变量 sum,其实这里extfunc 函数返回的就是闭包

按照我们熟悉的命令式语言的规则,extfunc 函数只是返回了内嵌函数 intfunc 的地址,在执行 intfunc 函数时将会由于在其作用域内找不到 sum变量而出错

而在函数式语言中,当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回

2 闭包注意事项

闭包中是不能修改外部作用域的局部变量的

演示代码

In [17]: def foo():

    ...:    m = 0

    ...:    def intfoo():

    ...:        m = 1

    ...:        print(m)

    ...:    print(m)

    ...:    intfoo()

    ...:    print(m) #不会改变

    ...:                                                                       

In [18]: foo()                                                                 

0

1

0

更多闭包使用问题,欢迎留言。

注意事项

01

对Python开发技术感兴趣的同学,欢迎加下方的交流群一起学习,相互讨论。

02

python交流学习扣扣群:975188894,多多交流问题,互帮互助,群里有不错的学习教程和开发工具。学习python有任何问题(学习方法,学习效率,如何就业),可以随时来咨询我!

相关文章

  • Python 闭包使用注意点

    1 Python 闭包 今天,聊下 python 的闭包。在函数编程中经常用到闭包。 闭包是什么,它是怎么产生的及...

  • groovy-闭包

    定义和执行闭包 闭包作为参数返回 闭包作为参数传递 闭包使用外部变量 注意: 闭包可使用(引用)闭包外部定义的变量...

  • python闭包学习

    参考文章 python闭包python闭包一步一步教你认识Python闭包深入浅出python闭包

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • 2018-11-20

    python函数的闭包 闭包: 嵌套函数调用外部函数的变量 注意: 闭包必须是内部函数调用外部函数定义的变量,这其...

  • 前端面试题

    1 ,什么是闭包?闭包有什么好处?使用闭包要注意什么? 详情可参考:http://www.jianshu.com/...

  • 闭包

    浅谈 python 的闭包思想 首先 python的闭包使用方法是:在方法A内添加方法B,然后return 方法B...

  • 面试题(day-2)

    1 ,什么是闭包?闭包有什么好处?使用闭包要注意什么? 闭包:函数嵌套函数,内部函数可以引用外部函数的参数和变量,...

  • Python 入门之 闭包

    Python 入门之 闭包 1、闭包 (1)在嵌套函数内使用(非本层变量)和非全局变量就是闭包 (2)_ clos...

  • Swift基础语法-闭包,闭包函数回调,尾随闭包,闭包捕获值,循

    本节知识点 闭包的基本概念 闭包基本使用 闭包表达式作为回调函数 闭包的多种写法(尾随闭包) 闭包表达式优化 闭包...

网友评论

    本文标题:Python 闭包使用注意点

    本文链接:https://www.haomeiwen.com/subject/ruyynqtx.html