函数名,闭包,装饰器
一:函数名
1, 函数名的内存地址,print(func)
2, 函数名可以赋值给其他变量
3, 函数名可以当做容器类的元素
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') l = [f1,f2,f3] d = {'f1':f1,'f2':f2,'f3':f3} # #调用 l[0]() d['f2']()
4, 函数名可以当做函数的参数.
5, 函数名可以当做函数的返回值.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func2(): print(222) def func3(x): # print(x) # x=func2() return x f = func2 f() #func2() ret = func3(func2) # ret=func2 ret() #func2() func3(func2)() def f1(): print('f1') def func1(argv): argv() #f1() return argv f = func1(f1) f()
二:闭包
1, 内层函数,对外层函数(非全局)的变量的引用,叫做闭包。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(): name = 'eva' def inner(): print(name) #此处打印的name是对上一层函数(外部作用域非全局作用域)变量的引用。 return inner f = func() f()
2, 闭包函数的检测:方法__closure__
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(): name = 'eva' def inner(): print(name) print(inner.__closure__) #此处打印的有cell元素,故inner是闭包函数。 return inner f = func() f() name = 'egon' def func2(): def inner(): print(name) print(inner.__closure__) #此处打印的是None,说明此内部函数inner不是闭包函数。 return inner f2 = func2() f2()
3,闭包的用处:如果说你内存函数是个闭包,python内部有一个机制,遇到闭包, 他会在内存中开启一个内存空间,不会随着函数的结束而关闭。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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')()
三:装饰器
1,什么是装饰器?
装饰器实际上是一个python函数,它可以让其它函数在不需要任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象,它经常用于切面需求的场景,比如:性能检测,缓存等。
2,简单的装饰器
比如给函数加一个性能检测的装饰器,程序如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time def timmer(f): #f=func def inner(): start_time = time.time() time.sleep(0.1) f() #func() end_time = time.time() print('----> 执行效率%s' % (end_time - start_time)) return inner @timmer # func = timmer(func) def func(): print('书法大赛') func() # inner()
3,带参数的装饰器,程序如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time def timmer(f): #f=func def inner(*args,**kwargs): print(*args,**kwargs) start_time = time.time() time.sleep(0.1) f("张三") #func("张三") end_time = time.time() print('----> 执行效率%s' % (end_time - start_time)) return inner @timmer# func = timmer(func) func=inner def func(a): print('%s书法大赛'%a) func("aaa") #inner("aaa")
4,带返回值的装饰器,程序如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time def timmer(f): #f=func def inner(*args,**kwargs): start_time = time.time() time.sleep(0.1) ret = f(*args,**kwargs) # 222 end_time = time.time() print('----> 执行效率%s' % (end_time - start_time)) return ret return inner @timmer # func = timmer(func) def func(a): return 222 print(func('萌哥')) #inner("萌哥')
5,通用装饰器,程序如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def wrapper(func): def inner(*args,**kwargs): '''执行函数前操作''' ret = func(*args,**kwargs) '''执行函数后的操作''' return ret return inner @wrapper #func=wrapper(func) def func(): print(66) func()