高阶函数(返回函数)

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回

比如:求和

def lazy_sum(*args):

  def sum():

      ax = 0

      for n in x args:

        ax = ax +n

       return ax

    return sum

当我们调用lazy_sum()时,返回的不是求和结果,而是求和函数:

>>> f = lazy_sum(1,3,5,7,9)

>>>f

<function  lazy_sum…>

调用函数f时,才真正计算求和的结果:

>>>f()

25

在这个例子中,我们在函数lazy_sum定义了sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回sum时,相关参数和变量都保存在返回的函数中,这种称为闭包。

另外,需要注意的问题,返回的函数并没有立刻执行,直到调用了f()才执行。

比如:

def count():

  fs[]

  for i in range(1,4):

       def f():

             return i*i

         fs.append(f)

     return fs

f1,f2,f3 = count()

上面的例子,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。

>>>f1()

9

>>>f2()

9

>>>f3()

9

全部是9,原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,他们所引用的变量i已经变成了3,因此最终的结果为9

返回闭包时需要牢记一点:返回函数就不要引用任何循环变量,或者后续会发生变化的变量。

如果一定要更改循环变量呢?

可以在创建一个函数,用该函数的参数绑定循环变量当前的值。

def count():

  def f(j):

    def g():

        return j*j

    return g

  fs[]

  for i in range(1,4):

       fs.append(f(i))

     return fs

f1,f2,f3 = count()

输出结果:

>>>f1()

1

>>>f2()

4

>>>f3()

9

小结:

一个函数可以返回计算结果,也可以返回一个函数

返回函数时,牢记该函数并未执行,返回函数中不要任何可能变化的变量。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值