Python的闭包(Closure)与惰性计算(Lazy Evaluation)
来源:互联网 发布:最全的淘宝隐藏券网站 编辑:程序博客网 时间:2024/05/19 17:04
闭包
在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。运行时,一旦外部的 函数被执行,一个闭包就形成了,闭包中包含了内部函数的代码,以及所需外部函数中的变量的引用。其中所引用的变量称作上值(upvalue)。
https://zh.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)
事实上,你可能在JavaScript那里看到过闭包,闭包在JavaScript是非常重要的常见高级特性。
我们可以来复习一下:
http://blog.csdn.net/solo95/article/details/70706623
惰性计算
讲Python惰性序列时,讲到过惰性计算,在来复习一下:
http://blog.csdn.net/solo95/article/details/78834041
Python中的闭包与惰性计算
闭包的基础是,语言层面要允许函数嵌套,即一个函数体里可以再包含了另一个一个函数,并且允许将函数作为返回值返回出去(这点也说明支持闭包的语言中,函数是对象的一种)。Python具备这些性质,因此也是支持闭包的语言。
闭包在Python中的使用和JavaScript不同,闭包在Python中的出现强调延迟得到结果,这点与惰性计算的特点相契合。
示例:
>>> def lazy_sum(*args): #可变参数标准写法 前面的博客提到过... def sum():... res = 0... for i in args:... res = res + i... return res... return sum...>>> lazy_sum(1, 2, 3, 4, 5) #返回值是函数<function lazy_sum.<locals>.sum at 0x04106198>>>> func = lazy_sum(1, 2, 3, 4, 5)>>> func() #调用函数func时 lazy_sum()才真正执行15>>>#闭包结构:#内部函数sum引用了外部函数lazy_sum的参数和局部变量#lazy_sum以函数sum作为返回值#返回时,相关参数和变量都存储在sum中
需要注意的地方
- 每次调用lazy_sum, 返回的是一个不同的sum对象
- 多次调用lazy_sum,上次调用的结果不会影响下一次
- 返回函数不要引用值会发生改变的变量
#!usr/bin/env python3# _*_coding: utf-8 _*_def count1(): fs = [] for i in range(1, 4): #i是闭包结构中的变量,被count1中的fs所引用 def f(): return i * i fs.append(f) return fsf1, f2, f3 = count1()print(f1())print(f2())print(f3())#结果999#由于惰性计算的原因 for循环执行完毕i等于3的时候 f才执行 务必注意闭包函数的执行时机#解决方法 将for循环和square函数分隔开 并将循环变量做为参数传入def count2(): def f(j): def g(): return j * j return g fs = [] for i in range(1, 4): fs.append(f(i)) #f(i)被立即执行 所以当前值被传入了f() return fsf4, f5, f6 = count2()print(f4())print(f5())print(f6())#结果149
以上例子来自廖雪峰的Python教程,原帖是介绍函数作为返回值的:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431835236741e42daf5af6514f1a8917b8aaadff31bf000#0
- Python的闭包(Closure)与惰性计算(Lazy Evaluation)
- 惰性求值-Lazy evaluation
- 性能-lazy evaluation(惰性计算法)
- 基于表达式模版(expression template)的惰性求值(lazy evaluation)
- python generator 的惰性计算
- Python闭包Closure
- Python Closure 闭包
- Python 闭包 ( closure )
- python 闭包 closure 总结
- Python中的闭包-closure
- C++的拖延战术:lazy evaluation
- Python 惰性计算
- 关于Python的惰性求值与惰性序列
- macro与惰性计算
- JS的闭包(closure)
- JS的闭包Closure
- 闭包closure的例子
- 闭包(closure)与协程共用时要注意的事情
- Petya and Staircases CodeForces
- js 按照特定日期格式获取当前时间
- org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-dat
- 如何解析DICOM文件中的Pixel Data ?
- ARM GCC 内嵌(inline)汇编手册
- Python的闭包(Closure)与惰性计算(Lazy Evaluation)
- 启动欢迎页面和广告图片轮转
- jfinal集成swagger
- io流处理的核心类的详解
- spring-boot web测试层学习记录
- 对单链表的排序(选择排序)
- Unity中Lerp与SmoothDamp函数使用误区浅析
- 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成
- CTF常见题型