在面向對象的編程中,一切皆對象,字符串是對象,列表是對象,函數也是對象
變量
拿字符串舉例,創建一個字符串,Python就在內存中創建一個字符串對象
'string' # 在內存中創建字符串對象
'string'
# 看起來是將字符串賦予變量s,實際上是將字符串對象'string'的引用指向了s,
# 因此變量s指向了對象'string'
s = 'string'
那么對于函數呢:
abs(-10) # 函數調用
10
abs # 函數本身
<function abs>
因為一切皆對象,所以函數也是對象,那么函數在創建的時候也是在內存中創建了一個求取絕對值的函數對象,那么函數名是什么呢,由上面字符串的例子可以猜測,函數名也是一個變量,該變量是對函數對象的引用。
f = abs # 將函數賦予變量f
f(-200) # 通過變量f調用求取絕對值的函數
200
另一個問題來了,看下面:
def output(s):
print('變量s指向的對象是:{}'.format(s))
output(s)
變量s指向的對象是:string
傳入函數
可以看到指向字符串的變量可以作為參數傳入函數,其他的諸如列表、字典等也可以作為參數傳入函數,那么指向函數的變量是否也可以傳入函數呢?
def func(f, num):
return f(num)
func(abs, -202)
202
def div_2(num):
return num / 2
func(div_2, 854)
427.0
我們將函數abs作為參數傳入了函數func,也可以將自定義的函數作為參數傳入了func
輸出函數
函數可以輸出變量,那么是否可以輸出函數呢?
def out_func(x):
def power_fun(y):
return y ** x
return squ_fun
print(out_func(3))
<function squ_fun at 0x7f5ec0867510>
返回了函數squ_fun(),該函數相當于一個求取立方的函數,返回下面的函數
def power_fun(y):
return y ** 3
print(out_func(3)(3)) #調用返回函數
27
上面的相當于先獲得一個求取立方數的函數,在調用求取立方數的函數,在打印結果
所以可以接受函數作為參數的函數,或者輸出函數的函數稱為高階函數