你所不知道的Python 函式引數的演進之路

2021-09-03 05:15:03 字數 2084 閱讀 3286

函式引數處理機制是python中乙個非常重要的知識點,隨著python的演進,引數處理機制的靈活性和豐富性也在不斷增加,使得我們不僅可以寫出簡化的**,也能處理複雜的呼叫。

呼叫時指定引數的名稱,且與函式宣告時的引數名稱一致。

關鍵字引數是python函式中最基礎也最常見的,我們寫乙個記賬的函式,引數是需要記錄的時間和金額。

這裡的amount引數就是乙個關鍵字引數,關鍵字引數支援兩種呼叫方式:

位置呼叫,就是按引數的位置進行呼叫,例如傳入兩個引數,第乙個是字串2018-07-06,第二個是整數10,那麼這兩個引數會被分別賦予date和amount變數,如果順序反過來,則這兩個引數分別賦予amount和date變數。

關鍵字呼叫,可以忽略引數順序,直接指定引數。

我們定義乙個person類,並實現它的__init__方法

當初始化這個類的時候,我們可以使用關鍵字呼叫,也可以使用位置呼叫。

對比上面兩種方式,我們會發現引數多的時候通過關鍵字指定引數不僅更加清晰,也更具有可讀性。如果我們希望函式只允許關鍵字呼叫,該如何做呢?python 3.0中,引入了一種新的僅限關鍵字引數,能實現我們的需求。

下面將age以後的引數修改為只允許關鍵字呼叫,定義函式時想指定僅限關鍵字引數,要把它們放到前面有星號的引數後面,在python中有星號的引數是可變引數的意思,如果不想支援可變引數,可以在引數中放乙個星號作為分割。

普通引數和僅限關鍵字引數中間由乙個星號隔離開,星號以後的都是僅限關鍵字引數,只可以通過關鍵字指定,而不能通過位置指定。

在函式宣告時,指定引數預設值,呼叫時不傳入引數則使用預設值,相當於可選引數。

上面**中沒有傳入amount引數,所以amount直接被置為預設值0。有一點需要注意的是,預設引數需要設定在必選引數後面,並且預設引數既可以通過位置呼叫,也可以通過關鍵字呼叫。

引數預設值既支援關鍵字引數,也支援僅限關鍵字引數。

「可變長」顧名思義是允許在呼叫時傳入多個引數,可變長引數適用於引數數量不確定的場景,可變引數有兩種,一種是關鍵字可變長引數,另一種是非關鍵字可變長引數。

非關鍵字可變長引數的寫法是在引數名前加乙個星號,python會將這些多出來的引數的值放入乙個元組中,由於元組中只有引數值而沒有引數名稱,所以是非關鍵字引數。

關鍵字可變長引數的寫法是在引數名前加兩個星號,python會將這些多出來的引數的值放入乙個字典中,由於字典中只有引數值而沒有引數名稱,所以是關鍵字引數。

python 3中為函式定義增加的另乙個新功能是函式註解,所謂函式註解,就是可以在函式引數和返回值上新增任意的元資料。

用create_person方法舉例,可以看到在每個引數後面都跟了乙個引數型別,在函式後面則是返回值型別,函式註解可以用在文件編寫、型別檢查中,在支援函式註解的ide中,如果傳入引數和返回的型別不符合函式註解中的型別,ide會提示錯誤。

但是函式註解只是乙個元資料,python直譯器執行時候並不會去檢查型別,所以下面這種情況也是合法的。

person(name=123, age='john') # 並不會報錯
python有著非常好入門的特點,但是隨著語言本身的演進,很多高階功能也在持續加入,用好這些功能可以使我們的python**擁有更高的可讀性,適應更加複雜的應用場景。

你所不知道的main()函式

我通常會把main函式定義成 void main 雖然這在vc等編譯器裡也能通過,但是這個是不對的。c 之父 bjarne stroustrup 在他的主頁上的 faq 中明確地寫著 the definition void main is not and never has been c nor h...

你所不知道的 const

const 常量是不可修改的,也就是說only read,例如 const int nbuffsize 512 nbuffsize 0 error就是因為const 常量不能修改,所以定義時必須初始化預設在全域性作用域中定義的非const變數可以在整個程式中訪問,例如 int ncounter ex...

你所不知道的background

今天要說說css中background這個屬性裡面的大學問。在乙個宣告中設定所有的背景屬性 body 看到這串 你怕了嗎?知道他們都代表啥意思嘛?不要捉急,來看展開式。展開式 background color設定元素的背景顏色,不能設定到外邊距,可以繼承父級的背景顏色,預設為透明。backgroun...