【python基础学习】基础重点难点知识汇总
2023-09-27 14:21:47 时间
python中decorator装饰器
语法示例:
@decorator
什么是装饰器:
问题:
定义一个函数后
在运行时动态增加功能
又不想改动函数本身的代码
示例:
# 希望对下列函数调用增加log功能,打印出函数调用: def f1(x): return x*2 def f2(x): return x*x def f3(x): return x*x*x
方法1:直接修改原函数的定义
def f1(x): print('call f1') return x*2 def f2(x): print('call f2') return x*x def f3(x): print('call f3') return x*x*x
有没有更简单的方法?
高阶函数 1. 可以接受函数作为参数 2. 可以返回函数 是否可以接受一个函数,对其进行包装,然后返回一个新函数?
方法2:通过高阶函数返回新函数(装饰器函数):
def f1(x): return x*2 def new_fn(f): def fn(x): print('call'+f.__name__+'()') return f(x) return fn
调用1:
g1 = new_fn(f1) print( g1(5) )
调用2:
f1 = new_fn(f1) print( f1(5) )
装饰器:
python内置@语法就是为了简化装饰器调用
@new_fn def f1(x): return x*2
等同于:
def f1(x): return x*2 f1 = new_fn(f1)
装饰器的作用:
可以极大简化代码,避免每个函数编写重复性的代码 打印日志:@log 检测性能:@performance 数据库事务:@transaction URL路由:@post('/register')
装饰器示例:
1. 如果自定义函数存在两个形参,上述装饰器函数内部固定写了一个形参,会出现错误怎么办:
@new_fn def add(x,y): return x+y # 这里会出现错误,所以需要更改 new_fn 函数如下: def new_fn(f): def fn(*args, **kwargs): print('call'+f.__name__+'()') return f(*args, **kwargs) return fn
2. 请编写一个@performance,它可以打印出函数调用的时间。计算函数调用的时间可以记录调用前后的当前时间戳,然后计算两个时间戳的差。
import time def performance(f): def fn(*args, **kw): t1 = time.time() r = f(*args, **kw) t2 = time.time() print 'call %s() in %fs' % (f.__name__, (t2 - t1)) return r return fn @performance def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10)
3.上述装饰器函数只能接受一个函数参数,如果装饰器函数需要传入额外的参数怎么办?
@log('DEBUG') def my_func(): pass
把上面的定义翻译成高阶函数的调用,就是:
my_func = log('DEBUG')(my_func)
上面的语句看上去还是比较绕,再展开一下:
log_decorator = log('DEBUG') my_func = log_decorator(my_func)
上面的语句又相当于:
log_decorator = log('DEBUG') @log_decorator def my_func(): pass
所以,带参数的log函数首先返回一个decorator函数,再让这个decorator函数接收my_func并返回新函数:
def log(prefix): def log_decorator(f): def wrapper(*args, **kw): print '[%s] %s()...' % (prefix, f.__name__) return f(*args, **kw) return wrapper return log_decorator @log('DEBUG') def test(): pass print test()
上述第二个例子:@performance只能打印秒,请给 @performace 增加一个参数,允许传入's'或'ms':
import time import functools def performance(unit): def perf_decorator(f): @functools.wraps(f) def wapper(*args, **kw): t1 = time.time() r = f(*args, **kw) t2 = time.time() t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1) print 'call %s() in %f %s' % (f.__name__, t,unit) return r return wapper return perf_decorator @performance('ms') def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10) print factorial.__name__
完善的装饰器写法:
相关文章
- 0基础Python入门学习路线图应该是怎样的?
- 零基础Python学习路线,小白成长逆袭大牛之路!
- 24岁非计算机专业工科妹子裸辞转行Python程序员,自学Python三个月,零基础如何系统学习python,从入门到精通?
- 35岁想转行,python适合新手零基础吗?
- 0基础怎么学习Python?Python学习方法汇总!
- 30岁0基础怎么学习Python?!
- 适合零基础人群学习的Python入门教程
- 2023版Python零基础入门基础教程(非常详细)
- Python能做什么兼职?零基础能学习吗?
- 零基础入门Python之后,学习结束后找什么工作?工资多少?
- python基础——装饰器
- python基础——filter函数
- python基础——函数的参数
- python 基础(一)字典
- python flask学习(1)与Git基础操作
- Python爬虫技术--基础篇--常用第三方模块Pillow和requests
- Python爬虫技术--基础篇--IO编程
- Python爬虫技术--基础篇--数据类型和变量,标识符与关键字,运算符和表达式
- Python零基础好学吗?零基础如何学习Python?
- 零基础怎么转行IT ?为什么要学习python?(下)
- 零基础怎么转行IT ?为什么要学习python?(上)
- 「Python-Django 智慧中医健康数字服务平台」中医问诊学习,开发原理理论基础
- Python机器学习零基础理解随机森林算法
- Python机器学习零基础理解朴素贝叶斯
- Python机器学习零基础理解K近邻算法
- Python机器学习零基础理解逻辑回归分析
- Andrew Ng-机器学习基础笔记(下)-Python实现代码
- Python学习---Python的框架基础学习
- 【Python基础】对log中的内容,进行字符串截取的例子
- 【百度领航团】小白零基础python学习笔记
- Unity 基础 之 Unity 简单调用 Python (传递多个参数并接收返回值)
- 学习笔记(06):Python网络编程&并发编程-在简单套接字基础上加上通信循环
- Python编程基础:实验7——文件和数据格式化