python学习笔记之基础操作(七)函数闭包和装饰器

装饰器

为其它函数添加附加功能,
原则:不修改装饰的函数源代码和调用方式
装饰器=高阶函数+函数嵌套+闭包 
高阶函数
函数的参数或者返回值是一个函数
#没有改变函数体,但是改变了调用方式
def test(func):
	print(fun)
	func()
def foo():
	print("saaa")
test(foo)  
#没有改变调用方式   
def test2(func):
	return func
foo = test2(foo)
foo()   
函数嵌套
函数内部定义新的函数,需要注意局部变量和全局变量的问题,在嵌套的结构中,变量的搜索优先在当前作用域内找,如果没有,则向上一级寻找,由于python没有像java那样区分定义和赋值的概念,因此在内层和外层同时读一个变量进行赋值操作只会在内层生效,外层不会生效,好像第二个例子
def father():
	print("father")
	def son():
		print("son")
	son()
	print(locals())#打印当前层局部变量
father()
def f():
	x = 1
	def r():
		x = 2
		print(x)
	r()
	print(x)
输出:	
2
1
会将内层定义的变量和外层区分开
装饰器框架
# @timmer 相当于test=timmer(test)
def timmer(func):
	def wrapper(*args,**kwargs):
		print(func)
		res = func(*args,**kwargs)
		return res    #注意需要有这个返回值,否则无法实现有返回值的装饰
	return wrapper
例如,有如下函数,想要新增打印函数地址的功能
,即上述装饰器
def test():
	print("1")
res = timmer(test)    #获得了新的wrapper的函数地址
res()   #执行wrapper
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值