1. 程式人生 > 資訊 >B站舉辦第一屆紀錄片釋出會,釋出《人生一串》《但是還有書籍》等 21 部新作

B站舉辦第一屆紀錄片釋出會,釋出《人生一串》《但是還有書籍》等 21 部新作

Python函式(函式定義、函式呼叫)

Python 中函式的應用非常廣泛,前面章節中我們已經接觸過多個函式,比如 input() 、print()、range()、len() 函式等等,這些都是 Python 的內建函式,可以直接使用。

除了可以直接使用的內建函式外,Python 還支援自定義函式,即將一段有規律的、可重複使用的程式碼定義成函式,從而達到一次編寫、多次呼叫的目的。

舉個例子,前面學習了 len() 函式,通過它我們可以直接獲得一個字串的長度。我們不妨設想一下,如果沒有 len() 函式,要想獲取一個字串的長度,該如何實現呢?請看下面的程式碼:
  1. n=0
  2. for c in "http://c.biancheng.net/python/":
  3. n = n + 1
  4. print(n)
程式執行結果為:

30

要知道,獲取一個字串長度是常用的功能,一個程式中就可能用到很多次,如果每次都寫這樣一段重複的程式碼,不但費時費力、容易出錯,而且交給別人時也很麻煩。

所以 Python 提供了一個功能,即允許我們將常用的程式碼以固定的格式封裝(包裝)成一個獨立的模組,只要知道這個模組的名字就可以重複使用它,這個模組就叫做函式(Function)。

比如,在程式中定義了一段程式碼,這段程式碼用於實現一個特定的功能。問題來了,如果下次需要實現同樣的功能,難道要把前面定義的程式碼複製一次?如果這樣做實在太傻了,這意味著每次當程式需要實現該功能時,都要將前面定義的程式碼複製一次。正確的做法是,將實現特定功能的程式碼定義成一個函式,每次當程式需要實現該功能時,只要執行(呼叫)該函式即可。

其實,函式的本質就是一段有特定功能、可以重複使用的程式碼,這段程式碼已經被提前編寫好了,並且為其起一個“好聽”的名字。在後續編寫程式過程中,如果需要同樣的功能,直接通過起好的名字就可以呼叫這段程式碼。

下面演示瞭如何將我們自己實現的 len() 函式封裝成一個函式:
  1. #自定義 len() 函式
  2. def my_len(str):
  3. length = 0
  4. for c in str:
  5. length = length + 1
  6. return length
  7. #呼叫自定義的 my_len() 函式
  8. length = my_len("http://c.biancheng.net/python/")
  9. print(length)
  10. #再次呼叫 my_len() 函式
  11. length = my_len("http://c.biancheng.net/shell/")
  12. print(length)
程式執行結果為:

30
29


如果讀者接觸過其他程式語言中的函式,以上對於函式的描述,肯定不會陌生。但需要注意的一點是,和其他程式語言中函式相同的是,Python 函式支援接收多個( ≥0 )引數,不同之處在於,Python 函式還支援返回多個( ≥0 )值。

比如,上面程式中,我們自己封裝的 my_len(str) 函式,在定義此函式時,我們為其設定了 1 個 str 引數,同時該函式經過內部處理,會返回給我們 1 個 length 值。

通過分析 my_len() 函式這個例項不難看出,函式的使用大致分為 2 步,分別是定義函式和呼叫函式。接下來一一為讀者進行詳細的講解。

Python函式的定義

定義函式,也就是建立一個函式,可以理解為建立一個具有某些用途的工具。定義函式需要用 def 關鍵字實現,具體的語法格式如下:

def 函式名(引數列表):
//實現特定功能的多行程式碼
[return [返回值]]

其中,用 [] 括起來的為可選擇部分,即可以使用,也可以省略。

此格式中,各部分引數的含義如下:
  • 函式名:其實就是一個符合 Python 語法的識別符號,但不建議讀者使用 a、b、c 這類簡單的識別符號作為函式名,函式名最好能夠體現出該函式的功能(如上面的 my_len,即表示我們自定義的 len() 函式)。
  • 形參列表:設定該函式可以接收多少個引數,多個引數之間用逗號( , )分隔。
  • [return [返回值] ]:整體作為函式的可選參引數,用於設定該函式的返回值。也就是說,一個函式,可以用返回值,也可以沒有返回值,是否需要根據實際情況而定。

注意,在建立函式時,即使函式不需要引數,也必須保留一對空的“()”,否則 Python 直譯器將提示“invaild syntax”錯誤。另外,如果想定義一個沒有任何功能的空函式,可以使用 pass 語句作為佔位符。

例如,下面定義了 2 個函式:
  1. #定義個空函式,沒有實際意義
  2. def pass_dis():
  3. pass
  4. #定義一個比較字串大小的函式
  5. def str_max(str1,str2):
  6. str = str1 if str1 > str2 else str2
  7. return str

雖然 Python 語言允許定義個空函式,但空函式本身並沒有實際意義。


另外值得一提的是,函式中的 return 語句可以直接返回一個表示式的值,例如修改上面的 str_max() 函式:
  1. def str_max(str1,str2):
  2. return str1 if str1 > str2 else str2
該函式的功能,和上面的 str_max() 函式是完全一樣的,只是省略了建立 str 變數,因此函式程式碼更加簡潔。

Python函式的呼叫

呼叫函式也就是執行函式。如果把建立的函式理解為一個具有某種用途的工具,那麼呼叫函式就相當於使用該工具。

函式呼叫的基本語法格式如下所示:

[返回值] = 函式名([形參值])

其中,函式名即指的是要呼叫的函式的名稱;形參值指的是當初建立函式時要求傳入的各個形參的值。如果該函式有返回值,我們可以通過一個變數來接收該值,當然也可以不接受。

需要注意的是,建立函式有多少個形參,那麼呼叫時就需要傳入多少個值,且順序必須和建立函式時一致。即便該函式沒有引數,函式名後的小括號也不能省略。

例如,我們可以呼叫上面建立的 pass_dis() 和 str_max() 函式:
  1. pass_dis()
  2. strmax = str_max("http://c.biancheng.net/python","http://c.biancheng.net/shell");
  3. print(strmax)
首先,對於呼叫空函式來說,由於函式本身並不包含任何有價值的執行程式碼,也沒有返回值,應該呼叫空函式不會有任何效果。

其次,對於上面程式中呼叫 str_max() 函式,由於當初定義該函式為其設定了 2 個引數,因此這裡在呼叫該引數,就必須傳入 2 個引數。同時,由於該函式內部還使用了 return 語句,因此我們可以使用 strmax 變數來接收該函式的返回值。

因此,程式執行結果為:

http://c.biancheng.net/shell

為函式提供說明文件

前面章節講過,通過呼叫 Python 的 help() 內建函式或者 __doc__ 屬性,我們可以檢視某個函式的使用說明文件。事實上,無論是 Python 提供給我們的函式,還是自定義的函式,其說明文件都需要設計該函式的程式設計師自己編寫。

其實,函式的說明文件,本質就是一段字串,只不過作為說明文件,字串的放置位置是有講究的,函式的說明文件通常位於函式內部、所有程式碼的最前面。

以上面程式中的 str_max() 函式為例,下面演示瞭如何為其設定說明文件:
  1. #定義一個比較字串大小的函式
  2. def str_max(str1,str2):
  3. '''
  4. 比較 2 個字串的大小
  5. '''
  6. str = str1 if str1 > str2 else str2
  7. return str
  8. help(str_max)
  9. #print(str_max.__doc__)
程式執行結果為:

Help on function str_max in module __main__:

str_max(str1, str2)
比較 2 個字串的大小

上面程式中,還可以使用 __doc__ 屬性來獲取 str_max() 函式的說明文件,即使用最後一行的輸出語句,其輸出結果為:

比較 2 個字串的大小