python中factor函数_Python学习(九)--[进阶]函数

闭包

Python的函数时可以嵌套的,可以将一个函数放在另外一个里面。

defmultiplier(factor):defmultiplyByFactor(number):return number*factorreturn multiplyByFactor

调用multiplier()时,返回的是里层函数,也就是说函数本身被返回了,但并没有被调用。重要的是返回的函数还可以访问它的定义所在的作用域。

在一个外函数中定义了一个内函数,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。如果外函数在结束的时候发现自己的临时变量将来会在内函数中用到,就会把这个临时变量绑定给了内部函数,然后自己再结束。

使用闭包的过程中,一旦外函数被调用了一次返回内函数的引用,虽然每次调用内函数是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量。

可以来看一个例子:

defcount():

fs=[]for i in range(1, 4):deff():return i*i

fs.append(f)returnfs

f1, f2, f3= count()

在这个例子里,每次循环,都会创建一个新的函数,然后把函数名放到列表fs里,并没有调用函数f,也就是说不会进行内部计算。最后把三个函数都返回。这里要注意的是,外函数变量fs,i都是只有一份的,所以循环了3次以后,i就变成了3。所以最后我们发现调用f1(),f2(),f3()返回的结果都是9。

>>>f1()9

>>>f2()9

>>>f3()9

匿名函数

lambda作为表达式,定义了一个匿名函数。比如:lambda x: x+1。实际上是定义了一个函数,和下面的效果一样。

deffun(x)return(x+1)

装饰器

在Python里函数也是一个对象,函数对象有一个__name__属性,可以拿到函数的名字:

>>> defname():

...print 'Tom'...>>> name.__name__‘name'

如果想要增强name()函数的功能,但是又不希望修改name()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”。

装饰器就是一个返回函数的高阶函数,比如定义一个打印日志的装饰器:

deflog(func):def wrapper(*args, **kw):print 'call %s():' % func.__name__

return func(*args, **kw)return wrapper

log是一个装饰器,接受一个函数作为参数,并返回一个函数。所以我们使用装饰器时,就需要用@语法:

@logdefname():print ‘Tom'

多以现在调用name(),相当于执行了name = log(name),然后再执行name()。

偏函数

Python的functools模块提供了片函数的功能。

比如int()函数可以把字符串转换为整数,也可以传入base参数,设置转换的进制。比如int(‘1234’,base = 8)。如果要转换大量的八进制字符串,每次都要传入进制参数,于是可以:

def int8(x,base = 8)return int(x,base)

我们也可以使用片函数实现相同的效果,也就是:

int8 = functools.partial(int, base=2)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值