python装饰器

(二十四)python 3 装饰器

邮差的信 提交于 2019-11-28 06:21:41
python装饰器的详细解析 python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。 这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌“原“”函数的函数。 一般而言,我们要想拓展原来函数代码,最直接的办法就是侵入代码里面修改,例如 import time def f(): print("hello") time.sleep(1) print("world")  这是我们最原始的的一个函数,然后我们试图记录下这个函数执行的总时间,那最简单的做法就是改动原来的代码: import time def f(): start_time = time.time() print("hello") time.sleep(1) print("world") end_time = time.time() execution_time = (end_time - start_time)*1000 print("time is %d ms" %execution_time) 但是实际工作中,有些时候核心代码并不可以直接去改,所以在不改动原代码的情况下,我们可以再定义一个函数。(但是生效需要再次执行函数) import time def deco(func): start_time =

python中的生成器、迭代器、闭包、装饰器

佐手、 提交于 2019-11-28 05:37:34
迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 可迭代对象 以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等; 一类是 generator ,包括生成器和带 yield 的generator function。 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。 判断是否可以迭代 可以使用 isinstance() 判断一个对象是否是 Iterable 对象: from collections import Iterable isinstance([],Iterable) # True isinstance({},Iterable) # True isinstance(123,Iterable) # False isinstance((x for x in range(10)),Iterable) # True 什么是迭代器 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。 可以使用 isinstance() 判断一个对象是否是 Iterator 对象: from collections import

python装饰器的小细节

痴心易碎 提交于 2019-11-28 04:36:47
以下是我看见python装饰器的一些我不熟悉的特点,所以记录一下 1 装饰器的特性:   1.1 可以吧被装饰的函数替换成不同的函数 decorate(func)。   1.2 加载模块时候立即执行 。这点很有用   这里我们可以给出最简单的装饰器 def decorate(func): print 'im a func' return func @decorate def foo(s): return 'the name is me %s' % s #启动程序 [out] im a func 2 闭包的特点:   2.1 inner 能访问 outer 及其祖先函数的命名空间内的变量(局部变量、函数参数)   2.2 调用 outer 已经返回了,但是他的命名空间被返回的 inner 对象引用,所以不会被回收 3 functool.wraps(func):   总结起来就是保存了func的 __name__, __doc__ 等信息,例如: # -*- coding: utf-8 -*- import functools def wrap1(func): @functools.wraps(func) def inner(): print 'wrap1' return func() return inner def wrap2(func): def inner(): print

python 装饰器,登录小练习

为君一笑 提交于 2019-11-28 04:36:11
目录 装饰器 无参装饰器 有参装装饰器 多层装饰器 作业 1 2 装饰器 无参装饰器 装饰器 import time def timmer(func): def wrapper(*args, **keargs): start = time.time() res = index stop = time.time() print('run time is %f' % (stop - start)) return wrapper @timmer # 装饰器 index = timmel(index) def index(): time.sleep(3) # 把函数运行时间延长三秒 print('welconme!') index() # timmer(index()) 个人理解 import time def timmer(func): # 闭包函数 def wrapper(): print(func) start_time=time.time() func() stop_time=time.time() print('run time is %f'%(stop_time-start_time)) return wrapper @timmer # 装饰语法 def index(): # 被装饰对象 time.sleep(3) print('welcome!') index()

Python小程序练习二之装饰器小例子

混江龙づ霸主 提交于 2019-11-28 04:35:49
Python小程序练习二之装饰器小例子 装饰器: 装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就不能大批量的修改源代码,这样是不科学的也是不现实的,因为就产生了装饰器,使得其满足: 1、不能修改被装饰的函数的源代码 2、不能修改被装饰的函数的调用方式 那么根据需求,同时满足了这两点原则,这才是我们的目的。 装饰器的原则组成: < 函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器 > 错误例子: 1、1Decorators.py 1 # The author is tou 2 # Version:Python 3.6.5 3 import time 4 5 def timer(func): 6 start_time = time.time() 7 func() 8 stop_time = time.time() 9 print("The func run time is :",(stop_time-start_time)) 10 11 @timer 12 def test1(): 13 time.sleep(1) #停1秒打印 14 print("This is test1") 15 @timer 16 def test2(): 17 time.sleep(1) #停1秒打印 18 print("This is test2") 19

python装饰器小例子

旧街凉风 提交于 2019-11-28 04:35:32
import timedef timer(func): #timer(test1) func=test1 def deco(*args,**kwargs): start_time=time.time() func(*args,**kwargs) stop_time=time.time() print("the func run time %s" %(stop_time-start_time)) return deco@timer #test1=timer(test1)def test1(): time.sleep(3) print("in the test1")@timerdef test2(name,age): time.sleep(2) print("in the test2" ,name,age)test1()test2("joan",5)输出结果: in the test1 the func run time 3.0043931007385254 in the test2 joan 5 the func run time 2.0034029483795166 来源: http://www.cnblogs.com/joangaga/p/7107243.html

python高阶函数、柯里化、装饰器、参数注解

南楼画角 提交于 2019-11-28 01:49:32
一、高阶函数 函数在python中是一等公民 函数也是对象,可调用的对象 函数可以作为普通变量,参数,返回值等等 高阶函数应当是至少满足:接受一个或多个函数作为参数;输出是一个函数 举例: def counter(base): def inc(step=1) base += step return base return inc 1、自定义sort函数 思路: 仿照内建函数sorted,自行实现一个sort函数(不使用内建函数),能够为列表元素排序 内建函数sorted函数是返回一个新的列表,可以设置升序或者降序,可以设置一个排序的函数 sorted函数的实现原理,扩展到map,filter函数的实现原理 方式一: def sort(iterable,reverse=False): ret = [] for x in iterable: for i,y in enumerate(ret): flag = x>y if reverse else x<y if flag: #找到大的就地插入 ret.insert(i,x) break else: ret.append(x) return ret print(sort([1,3,4,52,6,10]) 方式二: def sort(iterable,fn=lambda a,b:a>b): ret = [] for x in

myself1

狂风中的少年 提交于 2019-11-28 01:36:32
计算机基础之编程 编程语言是人与计算机交流的介质 编程是通过编程语言编写一大堆文件 为什么要编程-->奴役计算机,让计算机帮我们干活 计算机组成 CPU 控制器 运算器 内存 外存 输入设备 输出设备 IO设备 32位和64位 多核CPU 应用程序的启动 机械硬盘工作原理 机械手臂 磁道 扇区 平均寻道时间 平均延迟时间 平均寻找数据时间 固态硬盘工作原理 计算机操作系统 什么是文件 什么是应用程序 操作系统的作用 操作系统的启动 编程语言分类 机器语言 汇编语言 高级语言 编译型 解释型 网络瓶颈效应 网络的延迟时间远远大于应用程序的执行时间 python文件执行的两种方式 交互式 命令行式(python test.py) 变量 变量-->描述世间万物变化的状态 变量的组成 变量名的命名规范 变量名的两种定义方式 常量 常量-->python中约定俗称不变的量,但实际上是可以改变的,常量名全大写 变量内存管理 引用计数 垃圾回收机制 小整数池 定义变量的三种特征 打印值 打印内存 打印数据类型 import numpy as np arr = np.array([1, 2, 3]) arr array([1, 2, 3]) type(arr) numpy.ndarray 花式赋值 链式赋值 交叉赋值 注释 单行注释 多行注释 与用户交互 input input接收的值全是字符串

python常见问题

混江龙づ霸主 提交于 2019-11-28 00:20:47
1、 __new__.__init__区别,如何实现单例模式,有什么优点 __new__是一个静态方法,__init__是一个实例方法 __new__返回一个创建的实例,__init__什么都不返回 __new__返回一个cls的实例时后面的__init__才能被调用 当创建一个新实例时调用__new__,初始化一个实例时调用__init__ 2、深浅拷贝 浅拷贝只是增加了一个指针指向一个存在的地址,而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存,采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误 3、HTTP/IP相关协议,分别位于哪层 http协议是超文本传输协议,http协议是基于TCP/IP通信协议来传递数据 http协议工作与c/s架构上,浏览器作为http的客户端通过URL向http服务端即web服务器发送所用请求。web服务器收到所有请求后,向客户端发送响应信息, http特点是短连接,无状态 地址栏键输入URL,按下回车之后经历了什么? 1.浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址 2.解析出IP地址后,根据IP地址和默认端口80,和服务器建立TCP连接 3.浏览器发出读取文件的http请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器 4.服务器对浏览器请求做出响应

Python复习总结(2)

萝らか妹 提交于 2019-11-28 00:16:35
SHYLearn_Python 3. 格式化输入与输出 3.1 格式化输入 a = input ( < info > ) a = input ( repr ( str ) ) 3.2 格式化输出 3.2.1 print语句 print ( a , b ) 同行以空格隔开输出 print ( a , b , s ep = ',' ) 以逗号隔开进行输出 print ( s , ewp = '\n' ) 以换行隔开进行输出 print ( name , end = '!' ) 每个输出都要添加! print ( ' i love %s ' % s ) print 格式化输出 # 对字符串的每个元素进行换行输出 for item in list : print ( item ) 3.2.2 字符串方法format() print ( '{0} : {1} : {2}' . format ( hour , minute , second ) ) # 按照对齐格式化进行排列 print ( '{0:3},{1:5}' . format ( 12 , 534 ) ) : 后面的内容为只等的格式,表示占位数,如果不够,在前面用空格补齐 3.2.3 数据输出的格式类型 # a表示占位,不够,按照原长度打印,多了左侧空格补齐,小数点后面为保留几位小数,f位数据类型 print ( 'i love