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 ...
随机推荐
- Chisel3 - Tutorial - Functionality
https://mp.weixin.qq.com/s/3hDzpJiANdwp07hO03psyA 演示使用函数进行代码复用的方法. 参考链接: https://github.com/ucb- ...
- Java实现 LeetCode 793 阶乘函数后K个零 (分析)
793. 阶乘函数后K个零 f(x) 是 x! 末尾是0的数量.(回想一下 x! = 1 * 2 * 3 * - * x,且0! = 1) 例如, f(3) = 0 ,因为3! = 6的末尾没有0:而 ...
- Java实现 蓝桥杯VIP 算法提高 勾股数
算法提高 勾股数 时间限制:1.0s 内存限制:256.0MB 问题描述 勾股数是一组三个自然数,a < b < c,以这三个数为三角形的三条边能够形成一个直角三角形 输出所有a + b ...
- Java实现 LeetCode 127 单词接龙
127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...
- 第八届蓝桥杯JavaA组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.迷宫 题目描述 X星球的一处迷宫游乐场建在某个小山坡上. 它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母. ...
- java实现 洛谷 P1017 进制转换
import java.util.Scanner; public class Main { private static Scanner cin; public static void main(St ...
- java实现连续数的公倍数
为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4,5,6都是可以除尽6 ...
- java实现猜生日
** 猜生日** 今年的植树节(2012年3月12日),小明和他的叔叔还有小伙伴们一起去植树.休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:"我说个题目,看你们谁先猜出来!" ...
- Java实现第八届蓝桥杯最大公共子串
最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc", 可以找到 ...
- 连接mongoodb并且向数据库添加信息
连接mongoodb 首先安装mongoose 配置URL 连接Mongoodb数据库 控制台输入指令运行该js文件 像这样就连接成功了 向Mongodb数据库增加信息,首先需要写入表格信息 接着解构 ...