函数之装饰器
---恢复内容开始---
一。函数名(学名:第一类对象)
函数名本质上就是函数的内存地址。通俗点就是特殊的变量.
def my():
print(666)
print(my) # 函数名my在内存的地址
print(id(my)) #变量my在内存的地址
结果:
1.可以被引用(即可以赋值给其他变量)
def func(): print(666) f = func #将func赋值给f f() #相当于func()
结果:
2.可以被当作容器类型的元素
def func(): print(111) def func2(): print(222) def func3(): print(333) li = [func(),func2(),func3()] for i in li: i
结果;
3.可以当作函数的参数和返回值
def func(): print(111) def func2(): return func #当作返回值 f = func2() f() #当作参数
结果:
第一类对象(first-class object)指
1.可在运行期创建
2.可用作函数参数或返回值
3.可存入变量的实体。
二。闭包
闭包的定义:内层函数,对外层函数(非全局)的变量的引用,叫做闭包
闭包的用处:如果说你内存函数是个闭包,python内部有一个机制,遇到闭包
内存会在内存中开启一个内存空间,不会随着函数的结束而关闭,避免多次开关内存.
简单应用
from urllib.request import urlopen print(urlopen('http://www.cnblogs.com/jin-xin/articles/8259929.html').read()) def index(url): content = urlopen(url).read() def get(): with open('爬虫','a') as f1: f1.write(content.decode('utf-8')) return get index('http://www.cnblogs.com/jin-xin/articles/8259929.html')()
结果;
判断函数是否是闭包.__closure__
def func(): name = 'alex' def func2(): print(name) func2() print(func2.__closure__) #引用几个变量就有几个cell 这个函数就是闭包 不引用就是None 函数不是闭包 func()
结果:
三,在外层函数内部执行内部函数
def func(): def func2(): print(111) func2() func() def func(): def func2(): print(111) return func2 func()()
结果:
四。装饰器
1.比如计算一个函数的执行效率
import time def func(): print('666') start_time = time.time() time.sleep(0.1) func() end_time = time.time() print('------的执行效率%s'%(end_time-start_time))
结果:
2.进阶写法
import time def func(): print('666') def timmer(): start_time = time.time() time.sleep(0.1) func() end_time = time.time() print('------的执行效率%s'%(end_time-start_time)) timmer()
结果;
3.简单的装饰器
import time def func(): print('我们都一样') def timmer(): start_time = time.time() time.sleep(0.1) func() end_time = time.time() print('------的执行效率%s'%(end_time-start_time)) timmer()
结果;
4.带返回值的装饰器(语法糖的用法)
@timmer 相当于 #func = timmer(func) 即待求的函数名 = 新函数名(待求的函数名)
import time def timmer(func): def inner(*args,**kwargs): start_time = time.time() time.sleep(0.1) ret = func(*args,**kwargs) end_time = time.time() print('------执行效率%s'%(end_time-start_time)) return ret return inner @timmer def func(): return '666'
print(func())
结果:
5.通用装饰器
def wrapper(func): def inner(*args,**kwargs): '''执行函数前的操作''' ret = func(*args,**kwargs) '''执行函数后的操作''' return ret return inner @wrapper def func(): print(111) func()