高阶函数
一个函数能接受另一个函数作为参数传入,这样的一个函数就是高阶函数
在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