柯里化与python装饰器
当需要对已定义的函数进行功能扩展但又不能去改变原有函数时就会用到装饰器。装饰器在python中是非常常用且重要的功能,是一种python的语法糖。
在理解装饰器之前先看下面的加法函数:
def add(x,y):
return x + y
若想增加信息输出功能:
def add(x,y):
prtint("output")
return x + y
这样修改耦合太高,并且侵入了原有的业务代码。我们可以改成这样:
def add(x,y):
return x + y def test(fn):
print('begin') # 增强的输出
print('end') # 增强的功能
return fn print(test(add)(4,5))
使函数test()更便捷的传参:
def add(x,y):
return x + y def test(fn,*args,**kwargs): #相当于是*args,**kwargs作为参数传给fn这一函数对象。
print('begin') # 增强的输出
print('end') # 增强的功能
return fn(*args,**kwargs) # print(test(add,4,23))
对test()函数进行柯里化,让它只接收函数对象:
def test(fn):
def wrapper(*args,**kwargs):
print("hello")
print("world")
return fn(*args,**kwargs)
return wrapper print(test(add)(3,6))
使用装饰器:
def test(fn):
def wrapper(*args,**kwargs):
print("hello")
print("world")
return fn(*args,**kwargs)
return wrapper @test #等价于add = test(add)
def add(x,y):
return x + y @test #用test()函数再对add1()函数进行一次装饰,等价于add1 = test(add1)
def add1(x,y,z):
return x + y + z print(add(x=4,y=6))
print(add1(3,5,43))
可以理解为装饰器是用一个函数将另一个函数装饰了一次,在这里看似调用的是add()和add1()函数,但实际上调用的是test()函数,再由test()函数返回wrapper函数对象将参数传给内部fn()函数,test()函数中的参数是什么,fn()函数就是什么。(装饰器的用@表示。)
柯里化与python装饰器的更多相关文章
- python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化
函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面 ...
- Python高阶函数及函数柯里化
1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...
- Python进阶1---高阶函数、柯里化
高阶函数 不相等 自定义sort函数 内建函数--高阶函数 #sort函数 def sort2(lst,key = None,reverse = False): res = [] if key is ...
- 从0开始的Python学习007函数&函数柯里化
简介 函数是可以重用的程序段.首先这段代码有一个名字,然后你可以在你的程序的任何地方使用这个名称来调用这个程序段.这个就是函数调用,在之前的学习中我们已经使用了很多的内置函数像type().range ...
- python 高阶函数、柯里化
高阶函数 First Class Object 函数在python中是一等公民 函数也是对象,可调用的对象 函数可作为普通变量.参数.返回值等等 高阶函数 数学概念 y=g(f(x)) 在数学和计算机 ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
随机推荐
- Git 实用指南
传送门: https://mp.weixin.qq.com/s?__biz=MzI3MzgxNDY2MQ==&mid=2247484159&idx=1&sn=2d28513ef ...
- Rest API 操作List Items
获取所有的List Itemsfunction getItems(url) { $.ajax({ url: url, type: "GET", headers: { "a ...
- Tensor类型
Tensor类型 1.Tensor有不同的数据类型,每种类型又有CPU和GPU两种版本: 2.默认的tensor类型是FloatTensor,t.set_default_tensor_type可以修改 ...
- yarn的工作原理
1.YARN 是什么? 从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapReduce的 JobTracker/TaskTracker 机制需要大规模的调整来修复它在可扩展性, ...
- EDI
EDI, Electronic Data Interchange,电子数据交换 EDI 商务是指将商业或行政事务按一个公认的标准,形成结构化的事务处理或文档数据格式,从计算机到计算机的电子传输方法.简 ...
- Echarts 几个常用图
最近公司业务上的 需求,要求做一些图表,我们技术框架上选择方便使用的Echarts. 下面是效果图: 下面是具体代码: <!DOCTYPE html> <html> <h ...
- 微信小程序没有返回按钮怎么办?微信小程序左上角返回按钮怎么调出来?
如果你发现自己的小程序页面没有返回按钮,请检查是不是用的wx.redirectTo(OBJECT)进行的跳转,如果是那就把它改成wx.navigateTo(OBJECT)就可以了. wx.naviga ...
- [Swift]LeetCode96. 不同的二叉搜索树 | Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n? Example ...
- zuul进阶学习(二)
1. zuul进阶学习(二) 1.1. zuul对接apollo 1.1.1. Netflix Archaius 1.1.2. 定期拉 1.2. zuul生产管理实践 1.2.1. zuul网关参考部 ...
- PHP算法之二分查找
二分查找: 数组必须有序,且不重复. 一般实际工作中,很少有这样的数组,所以应用的很少,但是思想很好. 1 // 二分查找 2 $array = [10,14,23,33,45,56,65,77,89 ...