返回函数

函数作为返回值
高阶函数除了可以接受函数作为参数外,还可以吧函数作为结果值返回。
但是,如果不需要立刻求和,而是在后面的代码中,根据需要在计算怎么办?可以不返回求和的结果,而是返回求和的函数:

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

在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
请在注意一点,当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:

闭包
注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,但实现起来不容易。
需要注意的问题是,返回的函数并没有立即执行,而是直到调用了f()才执行。

每次循环,都创建了一个新的函数,然后,吧创建的3个函数都返回了。

返回闭包时要牢记一点:返回函数不要引用任何环境变量,或者后续会发生变化的变量、
如果一定要引入循环变量怎么办?方法是在创建一个函数,用该函数的参数绑定函数变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
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
然后在去看结果:

装饰器
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。

函数对象有一个_name_属性,可以拿到函数的名字:

now
偏函数
Python的functools模块提供了很多有用的功能,其中一个就是偏函数.
在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度,而偏函数也可以做到这一点。举例如下:
int()函数可以吧字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转化:
.
但int()函数还提供额外的base参数,默认值为10。如果传入base参数,就可以做N进制的转化:

假设要转换大量的二进制字符串,每次传入int(x,base=2)非常麻烦,于是,我们想到,可以定义一个Int2()的函数,默认吧base=2传进去:

简单总结functools.partial的作用就是,吧一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

int2=functools.partial(int,base=2)
实际上固定了int()函数的关键字参数base,也就是:
int2(‘10010’)
相当于:
kw={‘base’,2}
int{‘10010’,***kw}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值