python装饰器系列(一)

高阶函数

一个函数能接受另一个函数作为参数传入,这样的一个函数就是高阶函数

在python中一切皆对象,函数也不例外,函数是可以赋予给一个变量的

在python中,变量可以指向一个函数,函数的参数可以接收一个变量,那么函数的参数也就可以是一个函数

1 def num(x,y):
2     return y(x)
3 
4 def f(a):
5     return a ** 2
6 
7 num(4,f)
8 16

上边直接调用num()函数,把指向函数f(a)的函数名f,即f实质也是一个变量,作为一个变量传递给了num(x,y)函数中的参数y,这样也得到了正确的答案。所以函数中的参数可以接收一个函数。

总结:高阶函数的实质就是函数的参数能够接收另一个函数

装饰器

1 def deco(fn):
2     print('ha ha ha')
3     return fn
1 def myfun():
2     print('call myfun()')
#调用deco(fn)函数,把myfun函数作为参数传入,deco(fn)函数会先执行print语句,再返回fn函数,即这里的myfun函数。再让变量f4指向myfun()这个函数对象
1.f4 = deco(myfun) 2. ha ha ha
1 f4()   
2 #f4是指向myfun()函数对象的一个变量,因为变量可以指向一个函数,所以执行f4()就可以调用myfun()这个函数
3 call myfun

采用python的魔法也可以实现上边的相同效果

1 @deco
2 def myfun():
3     print('call myfun')
4 ha ha ha
1 myfun()
2 call myfun

@deco中的@是语法糖,表示下边定义的函数将会被@后的那个函数所修饰,即myfun()函数会被deco(fn)这个函数所修饰,实质就是执行了myfun = deco(myfun),所以打印出了ha ha ha,并把原来的myfun()函数返回回来,下边执行myfun()时就调用了原来的myfun()函数,输出了call myfun

1 myfun()
2 call myfun



猜你喜欢

转载自www.cnblogs.com/tianshug/p/10921701.html