python闭包与装饰器
2017-12-27 19:57
351 查看
什么是闭包
#定义一个函数 def test(number): #在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包 def test_in(number_in): print("in test_in 函数, number_in is %d"%number_in) return number+number_in #其实这里返回的就是闭包的结果 return test_in #给test函数赋值,这个20就是给参数number ret = test(20) #注意这里的100其实给参数number_in print(ret(100)) #注意这里的200其实给参数number_in print(ret(200))
运行结果
in test_in 函数, number_in is 100 120 in test_in 函数, number_in is 200 220
内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。
def func(): name = 'gg' def inner(): print(name) return inner f = func() f()
nonlocal访问外部函数的局部变量(python3) ****上一层局部变量,就近原则****
def counter(start=0): def incr(): nonlocal start start += 1 return start return incr c1 = counter(5) print(c1()) print(c1()) c2 = counter(50) print(c2()) print(c2()) print(c1()) print(c1()) print(c2()) print(c2())
判断闭包函数的方法__closure__
#输出的__closure__有cell元素 :是闭包函数 def func(): name = 'eva' def inner(): print(name) print(inner.__closure__) return inner f = func() f() #输出的__closure__为None :不是闭包函数 name = 'egon' def func2(): def inner(): print(name) print(inner.__closure__) return inner f2 = func2() f2()
思考:
1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成 2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
装饰器的前世今生
小掌门上班也有一段日子,终于到了发年终奖的时候,但年终奖评比的标准是一个问题,于是有人提议就用每个函数的执行时间来评比年终奖吧作为团队的小家伙,审核的工作便落在了小掌门身上
通常开发部门的代码是这样的
def func(): print("老板好")
小掌门灵机一动
import time def func(): start=time.time() print("老板好") time.sleep(0.1)#假设为执行时间,实际代码肯定不是一个print能搞定的 print(time.ctime()-start) func()
不知不觉,一个礼拜过去了,小掌门前前后后改了四五千个函数
import os from urllib.request import urlopen def webflush(func): def inner(*args,**kwargs): with open('a.txt', 'rb+') as file: if os.path.getsize('a.txt'): return file.read() else: re=func(*args,**kwargs) file.write(re) print(re) return re return inner @webflush def urlget(url): return urlopen(url).read() urlget("https://www.baidu.com")
答案
默写任务:
默写任务: 1.需默写代码&执行过程&使用方法 def timer(func): def inner(*args,**kwargs): '''执行函数之前要做的''' re = func(*args,**kwargs) '''执行函数之后要做的''' return re return inner @timer def aaa():print(‘a’) 2.默写代码 import time def timer(func): def inner(*args,**kwargs): start = time.time() ret = func(*args,**kwargs) print(time.time() - start) return ret return inner @timer #==> func = timer(func) def func(a): print('你好我好大家好') return '新年好'
相关文章推荐
- python 闭包及装饰器
- python 闭包和装饰器
- python的装饰器 就是闭包
- python的闭包,装饰器,@
- Python的闭包和装饰器
- python核心高级学习总结8------动态性、__slots__、生成器、迭代器、装饰、闭包
- python的闭包及装饰器
- python函数里面的装饰器和闭包的理解
- 流程的Python 第七章:函数装饰器和闭包
- python闭包,装饰器
- 【python】闭包、@修饰符(装饰器)、
- python闭包、装饰器
- python闭包和装饰器
- 关于Python中闭包与装饰器的理解
- Python 中的闭包与装饰器
- python闭包和装饰器(转)
- python闭包以及装饰器
- 简析Python的闭包和装饰器
- python的闭包与装饰器
- python 闭包和装饰器详解