廖雪峰的python笔记(八)--函数式编程之返回函数

  • 函数作为返回值--把函数作为结果值返回

在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力

  • 闭包

--注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。

--另一个需要注意的问题是,如果一个函数的返回值仍然是一个函数或者函数的某种形式(比如说列表中的元素都是函数的形式等),那么只有当这个被返回的函数被调用时才会返回值。[https://blog.csdn.net/jiaowosiye/article/details/79272721];

def count():
    fs=[]
    for i in range(1,4):
        def f():
            return i*i
        fs.append(f)
    return fs  

def count():
    fs=[]
    for i in range(1,4):
        def f():
            return i*i
        fs.append(f())
    return fs
原本使用的是fs.append(f) 原来列表中存的是函数,
现在列表中存放的是具体的值,因为f()就会调用上买你的函数,直接就会计算出来 return fs

另一种方法:
def count():
    fs=[]
    def f(i): #定义一个函数,返回值仍然是一个函数
        def g():
            return i*i
        return g
    for i in range(1,4):
    fs.append(f(i))
#这里调用函数之后会保存这个参数的值,而不是再下一次循环中把上一次的参数值给冲掉
    return fs

练习

利用闭包返回一个计数器函数,每次调用它返回递增整数:

def createCounter( ):
    def f( ):
        x = 0
        while True:
              x = x +1
              yield x
    #建立一个生成器
    sum = f( ) 
    #利用生成器来设计增数器
    def  counter( ):
         return next( sum )
    return counter

猜你喜欢

转载自blog.csdn.net/weixin_38715903/article/details/87632040
今日推荐