python高级-闭包-装饰器
闭包内容:
匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能
普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能
闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递是功能+数据
对象:能够完成最复杂的功能,传递很多数据+很多功能,因此传递的是数据+功能
———————————————————
对全局函数进行修改:在函数当中加global,在闭包中外边中的变量加nonlocal
闭包定义:有两个函数嵌套使用,里面的函数可以使用外面函数所传输的参数,最后可传递的是里面函数的结构与数据(个人理解)。
最后闭包可以在python中引申出装饰器 ———————————————————
def closure():
# 在函数内部再定义一个函数,
# 并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包
def closure_in(x):
print('---------我是打不死的%s--------' %x)
return closure_in
x = closure()
x('小强')
print('*'*20)
# -----加餐---------
def closure_1(a,b,c):
def closure_on(x):
print('-----%s加餐-------' %b)
print(a*x + c)
return closure_on
demo = closure_1(2,'小强',3) #传closure_1函数
demo(4) #传clsure_on函数
#注:函数不加括号,调用的是函数本身【function】;函数加括号,调用的是函数的return结果。
装饰器内容:
代码要遵守‘开放封闭’原则;对已经写好的函数遵守封闭,对功能扩展遵守开放;
# 装饰器的作用:为了对原来的代码上进行扩展
def decoration(func):
def call_func():
print('-------正在装饰 -------' )
func()
return call_func
#@decoration #--->demo_new = decoration(demo)
def demo():
print('demo----')
demo_new = decoration(demo)
demo_new()
使用装饰器来测试一个函数的运行时:
import time
def set_func(func):
def call_func():
start_time = time.time()
func()
stop_func = time.time()
print(‘alltimes is %f’ %(stop_func-start_fun))
return call_func
@set_func
def test1():
print(‘——-test1———’)
test1()
#等价于:
@set_func==test1 = set_func(test1)
1. 没有参数,没有返回值的函数进行装饰:
def set_func(func):
def call_func():
print(‘———test2——-’)
print(‘———-test3——’)
func()
return call_func @set_func
def test1():
print(‘——test1——- ’)
2. 对有参数无返回值的函数进行装饰:
def set_func(func):
def call_func(a): #变
print(‘———test2——-’)
print(‘———-test3——’)
func(a) #变
return call_func @set_func
def test1(num):
print(‘——test1——- %d ’ %num)
test1(100) —->call_func(100)
test1(200)——>call_func(200)
复现装饰器原理:
————————————————————————-
只要遇到@函数 装饰器(这句话),在程序中就已经执行了!!
3. 不定长参数的函数装饰:
def set_func(func):
def call_func(*args,**kwargs): #变
print(‘———test2——-’)
print(‘———-test3——’)
func(*args,**kwargs) #(拆包)将元祖拆开,每个进行传输;
#func(args,kwargs)—>不行,相当于传递了两个参数:一个元祖,一个字典。
return call_func @set_func
def test1(num,*args,**kwargs):
print(‘——test1——- %d ’ %num)
print(‘——test1——- ’ , args)
print(‘——test1——- ’ ,kwargs ) test1(100)
test1(100,200)
test1(100,200,300,mm=100)
注意:*args保存不定长参数,以元祖保存,**kwargs保存字典形式(mm=...)
4.对应的返回值参数进行装饰、通用装饰器:
#通用装饰器
def set_func(func):
print(“开始进行装饰———-”)
def call_func(*args,**kwargs): #变
print(‘———test2——-’)
print(‘———-test3——’)
return func(*args,**kwargs) #(拆包)将元祖拆开,每个进行传输;如果没有return ret返回none。
#func(args,kwargs)—>不行,相当于传递了两个参数:一个元祖,一个字典。
return call_func @set_func
def test1(num,*args,**kwargs):
print(‘——test1——- %d ’ %num)
print(‘——test1——- ’ , args)
print(‘——test1——- ’ ,kwargs )
return ‘ok’ #—-返回给上面的func(),然后return func—ret ret = test1(100)
5. 多个装饰器对同一个函数进行装饰:
def add_qx(func):
print(“——开始进行装饰权限1———-”)
def call_func(*args,**kwargs): #变
print(‘这是权限验证1’)
return func(*args,**kwargs)
return call_func
def add_xx(func):
print(“——开始进行装饰xx功能———-”)
def call_func(*args,**kwargs): #变
print(‘这是xx权限验证’)
return func(*args,**kwargs)
return call_func @add_qx
@add_xx
def test1():
print(‘——test1——-’)
test1()
首先执行第一个,但是第一个装饰器下面不是函数(装饰器原则:下面必须是函数,否则不执行),所以第一个函数先等待,等第二个装饰器执行后形成函数在交给第一个装饰器;所以运行结果是:
开始进行装饰xx的功能,
开始进行装饰权限1,
这是权限验证1,
这是xx权限验证,
——-
test1——-,
——————装饰器练习—————- 输出格式:<td><h1>haha</h1></td>
def set_func_1(func):
def call_func():
return ‘<h1>’ + func() + ’</h1>’
return call_func
def set_func_2(func):
def call_func():
return ‘<td>’ + func() + ’</td>’
return call_func @set_func_1()
@set_func_2()
def get_str():
return ‘haha’ print(get_str()) 最后执行的效果: <h1><td>haha</td></h1>
6. 用类对函数进行装饰(了解):
class Test(object):
def __init__(self,func):
self.func = fun def __call__(self):
print(‘这里是装饰器的功能。。。。’)
return self.func() @Test
def get_str():
return ‘haha’ print(get_str())
以上就是装饰器与闭包的全部内容,希望有所收获,如果有错误,希望指出,感谢!!
python高级-闭包-装饰器的更多相关文章
- python高级之装饰器
python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...
- 第二篇:python高级之装饰器
python高级之装饰器 python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- 【Python】 闭包&装饰器
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
- 网络编程-Python高级语法-装饰器
理论:装饰器就是运行一个函数之前首先运行装饰器函数,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数 ...
- python之闭包+装饰器
闭包 内部函数对外部函数作用域变量的引用. 函数内的属性都是有生命周期的,都是在函数执行期间 闭包内的闭包函数私有化了变量,类似于面向对象 图片解析 示例一 https://www.bilibili. ...
- Day11 Python基础之装饰器(高级函数)(九)
在python中,装饰器.生成器和迭代器是特别重要的高级函数 https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...
- Python深入05 装饰器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...
- 【Python】【装饰器】
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
随机推荐
- 添加对docker的监控
一.环境:已安装docker机器ip:192.168.0.202 二.原理 使用docker的metrics-add参数,提供对docker运行参数的访问条件. 三.修改/etc/docker/dae ...
- SpringMVC(一)概述、解析器与注解
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.SpringMVC的概述 1.概述 Spring MVC框架是一个开源的Java平台,为开发强大的基 ...
- Java实现 LeetCode 729 我的日程安排表 I(二叉树)
729. 我的日程安排表 I 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安排. MyCalendar 有一个 book(int sta ...
- Java实现 LeetCode 617 合并二叉树(遍历树)
617. 合并二叉树 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点 ...
- Java实现 蓝桥杯VIP 算法提高 扫雷
算法提高 扫雷 时间限制:1.0s 内存限制:256.0MB 问题描述 扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相 ...
- Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
算法提高 3-2字符串输入输出函数 时间限制:1.0s 内存限制:512.0MB 描述 编写函数GetReal和GetString,在main函数中分别调用这两个函数.在读入一个实数和一个字符串后,将 ...
- java实现第四届蓝桥杯连续奇数和
连续奇数和 题目描述 小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和. 比如: 2^3 = 8 = 3 + 5 3^3 = 27 = 7 + 9 + 11 4^3 = 64 = 1 + ...
- ant构建Jmeter脚本的build文件配置(build.xml)
使用此构建文件可自动发送邮件 代码如下: <?xml version="1.0" encoding="UTF8"?> <project na ...
- CMD指令和GIT指令
CMD指令 dir 显示当前文件夹的所有的文件目录 mkdir 创建文件夹 cd> 创建文件 rd 删除文件夹 del 删除文件 cls 清屏 Linux指令 查看版本 node -v node ...
- JS变量小总
变量分类:1.栈内存(stack)和堆内存(heap)2.基本类型和引用类型 #栈内存(stack) 一般为静态分配内存,其分配的内存系统自动释放. #堆内存(heap) 一般为动态分配内存,其分配的 ...