leozp / Blogs

MyBlog
0 stars 0 forks source link

函数式基本原理——闭包 #3

Open leozp opened 4 years ago

leozp commented 4 years ago

装饰器

Decorator,简单说就是把被装饰的函数作为参数,传递给与装饰器对应的函数。

def a(x):
  retuirn x

@a
def b():
  print("test")

本质上是语法糖

什么是闭包

闭包是一类特殊的函数。如果一个函数定义在另一个函数的作用域中,并且函数中引用了外部函数的局部变量(自由变量),那么这个函数就是一个闭包。被引用的自由变量即使已经离开了创造它的环境,也和函数一同存在。

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

lazy_sum(1,2,3,4,5)
<function sum at 0x10452f668>
lazy_sum(1,2,3,4,5)()
15

函数lazy_sum里定义了函数sum,sum和args就组成了闭包。

局部变量

nonlocal 与 global 的区别在于 nonlocal 语句会去搜寻本地变量与全局变量之间的变量,其会优先寻找层级关系与闭包作用域最近的外部变量。

闭包与修饰器

def makebold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped

def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped

@makebold
@makeitalic
def hello():
    return "hello world!"

print(hello())
# <b><i>hello world!</i></b>

闭包的作用

惰性求值

函数式编程的主题之一是关注分离(separation of concerns)。希望将计算的描述与实际运行分离 一般而言,惰性化对一个表达式分离了它的描述和求值。 https://segmentfault.com/a/1190000017066715?utm_source=tag-newest#articleHeader1 https://jijing.site/sicp/20190414-fp-closure-iterator.html

leozp commented 4 years ago

链接 https://jijing.site/sicp/20190414-fp-closure-iterator.html https://segmentfault.com/a/1190000004461404