作用:扩展原函数的功能,使用原函数名进行调用 原型-使用语法糖之前 import time def func(): print(大家好) time.sleep(0.1) def timmer(f): #装饰器函数 def inner(): start = time.time() f() end = time.time() print(end - start) return inner func=timmer(func) #func获得inner地址 func() #其实执行的是inner() 使用语法糖之后—原函数没有返回值 import ...
今天详细的研究了一下装饰器,怎么说呢,这个语言这种东西真的是要不断去消化和理解的,单纯的依靠外来的资源是比较难去学明白的,如果你还不明白装饰器那么不妨往下读一读,当你明白了装饰器之后,我们都会发现这个东西不是我们想象的那么难的一件事,但是我们如果想给一个完全没了解的人讲明白他的原理以及一些操作的时候就会发现有的东西,只可意会而不能去言传。哈哈哈,我这个人废话好多。 那么,开始了!简单介绍一下装饰...
1.容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:list, deque, …. set, frozensets, …. dict, defaultdict, OrderedDict, Counter, …. tuple, namedtuple, … str容器比较容易理...
闭包是一种函数,从形式上来说是函数内部定义(嵌套)函数,实现函数的扩展。在开发过程中,考虑到兼容性和耦合度问题,如果想在原有的函数基础上添加东西而又不改动原有函数的结构,通常会使用闭包。但闭包的功能还不只是这个。实际上,闭包会保留定义函数时存在的自由变量的绑定,这样在调用函数时,虽然定义作用域不可用了,但是仍然可以使用那些绑定的变量。简单来说,普通函数在调用完后,函数内部的变量就释放了(因为直接调...
当我们要扩展一个函数的功能,却不想修改原函数的时候,可以用装饰器,比如: 有函数function1:1 def function1(val): 2 val += 1 3 return val当我们想输出这个函数的执行时间时,通常可以考虑修改原函数:1 from time import time 2 3 4 def function1(val): 5 start = time() 6 val += 1 7 end = time() 8 print("time cost {0}".format(end - start))但是有时候我们不能修改原函数的代码,比如该函数...
装饰器:本质就是函数,为其他函数添加附加功能,一个原则是不修改函数的源代码,另外一个原则是不修改被修饰函数的调用功能 装饰器=高阶函数+函数嵌套+闭包 前戏import time def cal(l):start_time=time.time()res=0for i in l:time.sleep(0.1)res+=istop_time = time.time()print(函数的运行时间是%s %(stop_time-start_time))return resprint(cal(range(100)))def index():passdef home():pass 装饰器import timedef timmer(fu...
一、闭包 1.举例def outer():x = 10def inner(): # 内部函数print(x) # 外部函数的一个变量return inner# 调用inner()函数的方法 outer()() # 法一f = outer() f() # 法二 注意:inner()是局部变量,在全局范围不可调用(即不能直接调用inner()函数),但是在法二中,在执行完 f = outer() 之后,outer()函数就已经结束,执行f()的时候却可以调用inner()函数,并输出x的值,这是因为outer()里 return 的 i...
一、为什么要使用函数?1.避免代码重用2.提高代码的可读性 二、函数的定义与调用 1. def 函数名(参数1,参数2): 函数注释print(函数体)return 返回值定义:def关键字开头,空格之后接函数名和圆括号,最后还要加一个冒号。 def是固定的,不能变。函数名:函数名是包含字母,数字,下划线的任意组合,但是不能以数字开头。虽然函数名可以随便取名,但是一般尽量定义成可以表示函数功能的。 2.函数的调用返回值=函数...
要了解@property的用途,首先要了解如何创建一个属性。 一般而言,属性都通过__init__方法创建,比如:1 class Student(object): 2 def __init__(self,name,score): 3 self.name=name 4 self.score=score创建实例,运行结果:1 tim=Student(Tim,97) 2 tim.score=100 3 tim.score 4 100 5 mary=Student(Mary,90) 6 mary.score 7 90但是这样子有2个坏处: 1.__init__ 中定义的属性是可变的,如果一个系统的...
1,封装 # class Room:# def __init__(self,name,length,width):# self.__name = name# self.__length = length# self.__width = width# def get_name(self):# return self.__name# def set_name(self,newName):# if type(newName) is str and newName.isdigit() == False:# self.__name = new...
目录 Python - 三大器 迭代器,生层器,装饰器 一. 容器 二. 可迭代对象(iterable) 三. 迭代器 四. 生成器 五. 装饰器 1. 定义六. 闭包Python - 三大器 迭代器,生层器,装饰器 在介绍三大器之前先来了解一下容器和可迭代对象... 一. 容器 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不...
一、组合二、封装三、property装饰器四、多态 一、组合 1. 什么是组合一个对象的属性是来自于另外一个类的对象,称之为组合2. 为何用组合组合也是用来解决类与类代码冗余的问题3. 如何用组合 # class Foo: # aaa=1111 # def __init__(self,x,y): # self.x=x # self.y=y # # def func1(self): # print(Foo内的功能) # # # class Bar: # bbb=2222 # def __init__(self, m, n): # ...
装饰器: 作用域 , 高阶函数, 闭包 闭包:在一个内部函数里,对一个外部作用域进行引用,那么这个内部函数被认为是闭包def f():x = 5def fo(): # 内部函数print(x) # 5 x是外部环境的变量return fo # fo()就是一个闭包f()() foo= f() # 不能直接调用fo()函数,局部变量,全局变量无法调用 foo()关于闭包,就是一个内部函数加一个外部环境变量一个简单的装饰器import timedef func():start = time.time() # 获取当前时间...
问题:route中的装饰器为什么感觉和平时使用的不太一样,装饰器带参数和不太参数有什么区别?被修饰的函数带参数和不带参数有什么区别? 测试1:装饰器不带参数,被修饰的函数也不带参数。def log(func):print"execute log"print funcdef use_log():print "execute use log"def wrapper():print "start"func()print "end"returnreturn wrapperreturn use_log@log def cal():print "1+2" 此时输出为:execute log <function cal at ...
第1章 装饰器1.1什么是装饰器?装饰器就是用来为被装饰对象新增功能的工具/函数1.2装饰器原则:1. 不修改被装饰对象的源代码2. 不修改被装饰对象的调用方式1.3装饰器的目标:为被装饰对象加上新功能import timedef index(): time.sleep(1) print(index page)def outter(func): defwrapper(): start=time.time() func() stop=time.time() print(stop - start) returnwrapperindex=...