函数之装饰器
Posted wzqwer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数之装饰器相关的知识,希望对你有一定的参考价值。
---恢复内容开始---
一。函数名(学名:第一类对象)
函数名本质上就是函数的内存地址。通俗点就是特殊的变量.
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()
以上是关于函数之装饰器的主要内容,如果未能解决你的问题,请参考以下文章