變量可以指向函數(shù)
#函數(shù)的調(diào)用
>>> abs(-5)
5
#直接寫abs則返回函數(shù)對(duì)象
>>> abs
<built-in function abs>
#定義一個(gè)變量f艘儒,把它指向abs皱坛,對(duì)f調(diào)用相當(dāng)于對(duì)abs調(diào)用
#說明變量可以指向函數(shù)
>>> f = abs
>>> f(-8)
8
函數(shù)名其實(shí)就是指向函數(shù)的變量
#這里把a(bǔ)bs指向另一個(gè)函數(shù)跛十,則abs不再是求絕對(duì)值的函數(shù)了
>>> abs = len
>>> abs(-5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
#可以得到字符串的長(zhǎng)度
>>> abs('hehe')
4
#以上說明了函數(shù)名和普通的變量沒有區(qū)別岛请,它指向的只是一個(gè)函數(shù)對(duì)象
高階函數(shù):能接收函數(shù)做參數(shù)的函數(shù)
- 變量可以指向函數(shù)
- 函數(shù)的參數(shù)可以接收變量
- 一個(gè)函數(shù)可以接收另一個(gè)函數(shù)作為參數(shù)
- 能接收函數(shù)作參數(shù)的函數(shù)就是高階函數(shù)
來看一個(gè)高階函數(shù)的例子
>>> def add(x, y, f): #定義一個(gè)add函數(shù)
... return f(x) + f(y)
...
>>> add(-7, 9, abs) #對(duì)函數(shù)進(jìn)行調(diào)用
16
任務(wù)利用add(x,y,f)函數(shù),計(jì)算:
#答案
import math
def add(x, y, f):
return f(x) + f(y)
print add(25, 9, math.sqrt)
- 像這種內(nèi)層函數(shù)引用了外層函數(shù)的變量(參數(shù)也算變量)暴浦,然后返回內(nèi)層函數(shù)的情況溅话,稱為閉包(Closure)。
- 閉包的特點(diǎn)是返回的函數(shù)還引用了外層函數(shù)的局部變量歌焦,所以飞几,要正確使用閉包,就要確保引用的局部變量在函數(shù)返回后不能變同规。
- 高階函數(shù)可以接收函數(shù)做參數(shù)循狰,有些時(shí)候,我們不需要顯式地定義函數(shù)券勺,直接傳入匿名函數(shù)更方便绪钥。
- 匿名函數(shù)有個(gè)限制,就是只能有一個(gè)表達(dá)式关炼,不寫return程腹,返回值就是該表達(dá)式的結(jié)果。
- 使用匿名函數(shù)儒拂,可以不必定義函數(shù)名寸潦,直接創(chuàng)建一個(gè)函數(shù)對(duì)象,很多時(shí)候可以簡(jiǎn)化代碼