#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 学习网站:www.liaoxuefeng.com
#****************************************************
# Python3 函数式编程-装饰器 *
#****************************************************
print ("--------------------分割线------------------")
#============
# 装饰器Decorator
#============
# 函数对象赋值给变量,通过变量也能调用该函数。
def now():
print('today is sunday')
fun1 = now
fun1() # today is sunday
# 函数对象的__name__属性
print( now.__name__, fun1.__name__ ) # now now
'''
假设增强now()函数的功能,比如在函数调用前后自动打印日志,但又希望
修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称为
装饰器(Decorator)
本质上,decorator就是一个返回函数的高阶函数,所以定义一个能打印日志的
decorator。
'''
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
# log()函数是一个decorator,所以接受一个函数作为参数,并返回一个函数
# 使用@语法,把decorator置于函数的定义处:
@log
def today():
print('today is 2018-03-14')
today()
'''
函数执行结果:
call today():
today is 2018-03-14
'''
'''
把@log放到today()函数的定义处,相当于执行today = log(today)
由于log()是一个decorator,返回一个函数,所以原来的today函数仍然存在
只是现在同名的变量指向了新的函数,于是调用today()将执行新函数,即在
log()函数中返回的wrapper()函数
wrapper()函数的参数定义是(*args, **kw),因此wrapper()函数可以接受任意
参数的调用,在wrapper()函数内,先打印日志,再调用原始函数。
'''
print ("--------------------分割线------------------")
'''
如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数
'''
# 自定义Log的文本,3层嵌套的decorator
def Log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@Log('execute')
def hel():
print('hello Bugliu')
hel()
'''
执行结果:
execute hel():
hello Bugliu
'''
'''
解析:
hel() 相当于 hel = log('execute')(now)
首先执行log('execute'),返回的是decorator函数,再调用返回的函数,
参数是now函数,返回值最终是wrapper函数。
'''
print ("--------------------分割线------------------")
print( hel.__name__ ) # wrapper
# 经过decorator装饰之后,函数对象的__name__属性从原来的'hel'变成了
# ‘warpper’,因为返回的那个wrapper()函数名字就是'wrapper',所以需要把
# 原始函数的__name__属性复制到wrapper()函数中,否则,有些依赖函数签名
# 的代码执行就会出错
# 可以使用内置的functools.wraps,完整的decorator
import functools
def LOG(text):
def decorator(func):
@functools.wraps(func) # 增加此行可解决属性问题
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@LOG('正在执行')
def hel():
print('hello Bugliu')
hel()
print( hel.__name__ )
'''
执行结果:
正在执行 hel():
hello Bugliu
hel
'''
print ("--------------------分割线------------------")
# 请设计一个decorator,它可作用于任何函数上,并打印该函数的执行时间:
import time
import functools
def metric(func):
@functools.wraps(func)
def wrapper(*args,**kw):
startTime = time.time()
test = func(*args,**kw)
endTime = time.time()
t = endTime - startTime
print('executed in %s ms' % t)
return test
return wrapper
@metric
def fast(x, y):
time.sleep(0.0012)
return x + y;
@metric
def slow(x, y, z):
time.sleep(0.1234)
return x * y * z;
f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
print('测试失败!')
elif s != 7986:
print('测试失败!')
'''
执行结果:
executed in 0.0025014877319335938 ms
executed in 0.1245872974395752 ms
'''
print ("--------------------分割线------------------")
"""
写出一个@log的decorator,使它既支持:
@log
def f():
pass
又支持:
@log('execute')
def f():
pass
"""
def log(arg):
def inner_log(text='call'):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
if callable(arg):
return inner_log()(arg)
return inner_log(arg)
@log
def f():
pass
@log('execute')
def f2():
pass
f() # call f():
f2() # execute f2():
相关推荐
国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
Python3 学习笔记6_字符串_20180224
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 字符串 * #*************************...
PotPlayer自用皮肤
自用 PotPlayer 皮肤,仅微调了字体大小与颜色,是按个人习惯调整,未做适配性调整。
Python3 学习笔记20_函数式编程-高阶函数-map/reduce_20180312
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-高阶函数-map/reduce * #************************...
2-shell及常用命令-续.pdf
2-shell及常用命令-续.pdf
STM32+W5500实战:5分钟搞定FreeModbus TCP移植(附完整代码)
本文详细介绍了如何在STM32微控制器上,结合W5500以太网芯片,快速完成FreeModbus TCP协议栈的移植,构建稳定可靠的工业级Modbus TCP服务器。内容涵盖硬件连接、软件架构、驱动适配、核心移植代码实现及调试优化技巧,旨在提供可直接应用于实际项目的完整解决方案。
Python3 学习笔记5_数字(Number)_20180223
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 数字(Number) * #***********************...
关于华为高斯数据库出现Invalid or unsupported by client SCRAM mechanisms定位解决的过程
最近公司有个新项目使用的是高斯数据库,因为我们的项目是直接从别的项目组拿来的,配置都是已经配好的,但是在放到正式环境上之后出现报错。起初我们以为是测试和正式的版本不一致,但是结果是版本一致的。最后这个问题搞了我们几个小时,都没法解决。
Python3 学习笔记8_元组_20180227
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 元组 * #*************************...
【阿里云大模型高级工程师ACP习题集】2.4 自动化评测答疑机器人的表现(⭐️⭐️⭐️ 重点章节!!!)
【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!
商品评论中的实体情感分析
在之前的文章中我已经将商品评论中的评价实体,也就是特征(feature)给挖掘出来了,我看了一下,挖掘的效果还是不错的。原文链接:http://blog.youkuaiyun.com/chixujohnny/article/details/52794685 下面一步要做的是施加情感因子,也就是说,要将人们评论时候所连带的感情程度施加一下。这项任务的归类应该是情感分析技术。 目前该类问题的情感分析技
Python3 学习笔记14_递归函数_20180305
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数 * #************************...
Nuclei漏洞扫描:从零到精通的Windows实战指南
本文详细介绍了Nuclei漏洞扫描工具在Windows平台上的安装与使用教程,从基础安装到高级实战技巧全面覆盖。通过具体案例展示如何利用Nuclei的模板库快速检测常见漏洞,并提供自定义POC开发指南,帮助安全从业者高效开展漏洞扫描工作。
Python3 学习笔记4_运算符_20180223
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 运算符 * #*************************...
EBS开发_创建AP付款
--以下代码于20181002在Tony环境测试通过 /* BEGIN --mo_global.init('SQLAP'); apps.fnd_global.apps_initialize(user_id => 1110, resp_id => 50597, resp_appl_id => 20003); --mo_global.set_policy_context(...
2.1 直流无刷电机(BLDC):机械结构与组件
本文详细解析了直流无刷电机(BLDC)的机械结构与核心组件。BLDC电机通过电子换向取代传统机械电刷,主要包含定子、转子、位置传感器和电子换向器四大组件。定子采用硅钢片叠压结构,配有三相绕组;转子采用永磁体材料,结构设计影响转矩特性;位置传感器(霍尔、编码器、旋转变压器)实现精准换向;电子换向器通过功率逆变拓扑完成电流控制。文章还对比了不同绕组类型、永磁材料及传感器技术的性能特点,为BLDC电机的设计与应用提供了理论基础。
Python3 学习笔记21_函数式编程-高阶函数-filter/sorted_20180312
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-高阶函数-filter/sorted * #*************************...
Unity零基础到入门 ☀️| 【UI系统学习】认识Unity引擎中几种最常用 UI系统,这一篇文章就够用了!
轻松学会 Unity 的 UGUI基础控件 使用 Unity中的UI介绍 UI即User Interface(用户界面)的简称。泛指用户的操作界面,UI设计主要指界面的样式,美观程度。而使用上,对软件的人机交互、操作逻辑、界面美观的整体设计则是同样重要的另一个门道。好的UI不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。 据我所知Unity中有两种自带的UI,一种是UGUI,一种是GUI Legacy GUI:旧版 UI,只有两个组件:文字和图片,配合鼠标事件来
Python3 学习笔记13_函数的参数_20180305
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数 * #************************...
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
Python3 学习笔记23_函数式编程-匿名函数_20180314
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-匿名函数 * #************************...
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
Python3 学习笔记11_条件语句_20180301
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 循环语句 * #*************************...
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
Python3 学习笔记9_字典_20180228
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 字典 * #*************************...
Python3 学习笔记1_基础语法_20180209
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 教程 * #*********************...
Python3 学习笔记10_条件语句_20180228
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 条件语句 * #*************************...
Python3 学习笔记25_函数式编程-偏函数_20180315
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.liaoxuefeng.com #**************************************************** # Python3 函数式编程-偏函数 * #************************...
Python3 学习笔记3_基本数据类型_20180222
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 学习网站:www.runoob.com #**************************************************** # Python3 基本数据类型 * #***************************...
502



被折叠的 条评论
为什么被折叠?



