def say(text): print(text)speak = sayspeak('hello') # hellodel saysay('hello') # NameError: name 'say' is not definedspeak('hello') # hello
speak 只是這個函數對象的另一個名字,也就是說你可以刪除原來的名字(say),仍然可以通過 speak 調用這個函數。這就像普通的變量賦值一樣。請看下圖了解。
正如我們在第一節中了解到的,函數是 Python 中的對象,我們可以將它們存儲在數據結構中,就像任何其他對象一樣。要訪問存儲在其中的函數對象,假設列表的工作方式如下:
def say(text): print(text)funcs = [say, str.lower, str.upper]for func in funcs: print(func, "執行返回值:", func("Hello"))# 運行結果:# Hello# <function say at 0x7f9b880c6320> 執行返回值:None# <method 'lower' of 'str' objects> 執行返回值:hello# <method 'upper' of 'str' objects> 執行返回值:HELLO
第一次聽到這個詞,你會覺得很奇怪,但是你可以確定,函數也是一個對象,可以作為參數傳遞給另一個函數。
def sayUpper(text): print(text.upper())def sayLower(text): print(text.lower())def speak(text, func): func(text)speak('Hello', sayUpper) # HELLOspeak('Hello', sayLower) # hello
上面的例子我們定義了兩個函數,sayUpper 和 sayLower,然后調用 speak 函數,將他們作為參數傳遞給 speak函數。
函數可以作為返回值,這個返回值就是一個函數。
def speaker(volume): def quiet(text): return text.lower() def loud(text): return text.upper() if volume < 20: return quiet else: return louds = speaker(10)print(s('Hello')) # helloS = speaker(30)print(S('Hello')) # HELLO
上面的例子定義了一個函數 speaker,它接受一個參數 volume,如果 volume 小于 20,返回一個函數 quiet,否則返回一個函數 loud。執行 speaker 函數,我們傳入 10,它將返回一個函數 quiet,執行 speaker 函數,我們傳入 30,它將返回一個函數 loud。例子中s、S 變量都是函數,它們都是 speaker 函數的返回值。
通過上面函數的性質:可以理解 python 裝飾器的本質是一個函數,它接受一個函數作為參數,并返回一個函數。
所有函數都是對象,但所有對象都不是函數。但是,可以將對象設置為可調用的,這允許將它們視為函數(在某些情況下)。為此,我們可以使用 __call__ 屬性。
class Subtrack: def __init__(self, a, b): self.a = a self.b = b def __call__(self, x): return self.a - self.b - xX = Subtrack(10, 5)print(X(2)) # 3
上面的例子定義了一個類 Subtrack,它有兩個屬性a 和 b,并且定義了一個函數 __call__,它可以將對象設置為可調用的。為此,我們可以使用 __call__ 屬性。X 是 Subtrack 類的實例,因為存在__call__ 函數,它可以像函數一樣被調用。需要主要并不是所有的類都有 __call__ 屬性。
通過上面的學習你是否更熟悉了 Python 的函數了?
本文鏈接:http://www.www897cc.com/showinfo-26-55027-0.html深入理解python函數,一切皆對象
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 五個VS Code技巧,開發更快更高效