Python的的函数柯里化和装饰器

本文探讨了Python中的函数柯里化概念,它将接受两个参数的函数转换为接受一个参数并返回新函数的过程。同时,文章介绍了装饰器的作用,用于在不改变原函数实现的情况下增加其附加功能,例如在加法函数中添加日志输出。最后提到了`functools`模块中的`wraps`装饰器,用于帮助保持被装饰函数的元信息。

柯里化

  • 指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
  • z = f(x, y) 转换成 z = f(x)(y)的形式
举个栗子
将加法函数柯里化:
def add(x, y): 
	return x + y

>>> def add(x):
>>>		def _add(y):
>>> 		return x + y	
>>> 	return _add
>>> add(4)(5)
9
**通过嵌套函数就可以把函数转换成柯里化函数

装饰器

在我理解看来,装饰器就是增强一个函数的附加功能,而不改变该函数的所以实现
比如说:我们想对 一个加法函数,做一个增强,就是额外打印输出一些信息

>>> def add(x,y):
>>>		return x + y


实现1:
>>>  def logger(fn):
>>> 	print('begin')
>>>		x = fn(4,5)
>>> 	print('end')
>>> 	return x
>>> print(logger(add))
begin
end
9
这个函数看似增强的一些打印信息,但是没法传入参数,就有问题了,不通用

实现2:解决传参问题
>>> def logger(fn,*args,**kwargs):
>>>		print('begin')
>>>		x = fn(*args,**kwargs)
>>> 	print('end')
>>> 	return x
>>> print(logger(add,5,60))
begin
end
65

实现3:将这个函数柯里化
>>> def logger(fn):
>>> 	def _logger(*args,**kwargs):
>>> 		print('begin')
>>> 		ret = fn(*args,**kwargs)
>>> 		print('end')
>>> 		return ret
>>> 	return _logger
>>> add = logger(add) 
>>> print(add(x=5, y=10))
begin
end
15

实现4: 使用装饰器语法糖
>>> def logger(fn):
>>> 	def _logger(*args,**kwargs):
>>> 		print('begin')
>>> 		ret = fn(*args,**kwargs)
>>> 		print('end')
>>> 		return ret
>>> 	return _logger
>>> @logger #等价于 add = logger(add)
>>> def add(x,y):
>>>		return x + y
>>> print(40,50)
begin
end
90

functools模块

@functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

import functools,datetime,time

def logger(duration, func = lambda name, duration: print('{} took {}s'.format(name, duration))):
    def _logger(fn):
        @functools.wraps(fn)
        def wrapper(*args,**kwargs):

            start = datetime.datetime.now()
            ret = fn(*args,**kwargs)
            delta = (datetime.datetime.now() - start).total_seconds()
            if delta > duration:
                func(fn.__name__, duration)

            return ret
        return wrapper
    return _logger

@logger(5) # add = logger(5)(add)
def add(x,y):

    'this is a add function'
    time.sleep(1)
    return x + y

print(add(5, 6), add.__name__, add.__wrapped__, add.__dict__,add.__doc__, sep='\n')

输出:
11
add
<function add at 0x1033fca60>
{'__wrapped__': <function add at 0x1033fca60>}
this is a add function
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值