柯里化与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装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
随机推荐
- python学习:利用循环语句完善输入设置
利用循环语句完善输入设置 使用for循环: 代码1:_user = "alex"_password = "abc123" for i in range(3): ...
- lodash 实现一些常见的功能
排序 const sorted = _.orderBy(filtered, [sortColumn.path], [sortColumn.order]); 数组切片 普通的 slice 可传递两个参数 ...
- webpack配置非CMD规范的模块
一.前言 webpack在配置多页面开发的时候 ,发现用 import 导入 Zepto 时,会报 Uncaught TypeError: Cannot read property 'createEl ...
- HBuilder git合作-上传项目到Git Hub
1.初始项目的创建 这里假设你已经在Git Hub上面建立好了代码的远程仓库,并已经邀请好了队员 在HBuidler中创建好初始的项目,然后右键,"Team"->" ...
- CountDownLatch使用场景
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...
- [SQL]LeetCode184. 部门工资最高的员工 | Department Highest Salary
The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...
- [Swift]LeetCode211. 添加与搜索单词 - 数据结构设计 | Add and Search Word - Data structure design
Design a data structure that supports the following two operations: void addWord(word) bool search(w ...
- [Swift]LeetCode461. 汉明距离 | Hamming Distance
The Hamming distance between two integers is the number of positions at which the corresponding bits ...
- [Swift]LeetCode522. 最长特殊序列 II | Longest Uncommon Subsequence II
Given a list of strings, you need to find the longest uncommon subsequence among them. The longest u ...
- [Swift]LeetCode752. 打开转盘锁 | Open the Lock
You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', ...