Python 中,函數的應用非常廣泛,前面章節中我們已經接觸過多個函數,比如 input() 、print()、range()、len() 函數等等,這些都是 Python 的內置函數,可以直接使用。
除了可以直接使用的內置函數外,Python 還支持自定義函數,即將一段有規律的、可重復使用的代碼定義成函數,從而達到一次編寫、多次調用的目的。
比如,在程序中定義了一段代碼,這段代碼用於實現一個特定的功能。問題來了,如果下次需要實現同樣的功能,難道要把前面定義的代碼復制一次?如果這樣做實在太傻了,這意味着每次當程序需要實現該功能時,都要將前面定義的代碼復制一次。正確的做法是,將實現特定功能的代碼定義成一個函數,每次當程序需要實現該功能時,只要執行(調用)該函數即可。
通俗來講,所謂函數,就是指為一段實現特定功能的代碼“取”一個名字,以后即可通過該名字來執行(調用)該函數。使用函數,可以大大提高代碼的重復利用率。
通常,函數可以接收零個或多個參數,也可以返回零個或多個值。從函數使用者的角度來看,函數就像一個“黑匣子”,程序將零個或多個參數傳入這個“黑匣子”,該“黑匣子”經過一番計算即可返回零個或多個值。
對於“黑匣子”的內部細節(就是函數的內部實現細節),函數的使用者並不需要關心。就像前面在調用 len()、max()、min() 等函數時,我們只負責傳入參數、接收返回值,至於函數內部的實現細節,我們並不關心。
如圖 1 所示為函數調用示意圖:

圖 1 函數調用示意圖
從函數定義者(實現函數的人)的角度來看,其至少需要想清楚以下 3 點:
- 函數需要幾個關鍵的需要動態變化的數據,這些數據應該被定義成函數的參數。
- 函數需要傳出幾個重要的數據(就是調用該函數的人希望得到的數據),這些數據應該被定義成返回值。
- 函數的內部實現過程。
不難看出,定義函數比調用函數要難得多,而本節正是教你如何定義函數的。不過不用擔心,對於實現過程復雜的函數,定義本身就很費力,有時候實現不出來也完全正常。
Python函數的定義
定義函數,也就是創建一個函數,可以理解為創建一個具有某些用途的工具。定義函數需要用 def 關鍵字實現,具體的語法格式如下:
def 函數名(形參列表):
//由零條到多條可執行語句組成的代碼塊
[return [返回值]]
其中,用 [] 括起來的為可選擇部分,即可以使用,也可以省略。
此格式中,各部分參數的含義如下:
- 函數名:從語法角度來看,函數名只要是一個合法的標識符即可;從程序的可讀性角度來看,函數名應該由一個或多個有意義的單詞連綴而成,每個單詞的字母全部小寫,單詞與單詞之間使用下畫線分隔。
- 形參列表:用於定義該函數可以接收的參數。形參列表由多個形參名組成,多個形參名之間以英文逗號(,)隔開。一旦在定義函數時指定了形參列表,調用該函數時就必須傳入相應的參數值,也就是說,誰調用函數誰負責為形參賦值。
- 注意,在創建函數時,即使函數不需要參數,也必須保留一對空的“()”,否則 Python 解釋器將提示“invaild syntax”錯誤。另外,如果想定義一個沒有任何功能的空函數,可以使用 pass 語句作為占位符。
- 下面程序定義了兩個函數:
- def my_max(x, y) :
- # 定義一個變量z,該變量等於x、y中較大的值
- z = x if x > y else y
- # 返回變量z的值
- return z
- # 定義一個函數,聲明一個形參
- def say_hi(name) :
- print("===正在執行say_hi()函數===")
- return name + ",您好!"
Python函數的調用
調用函數也就是執行函數。如果把創建的函數理解為一個具有某種用途的工具,那么調用函數就相當於使用該工具。
函數調用的基本語法格式如下所示:函數名([形參值])
其中,函數名即指的是要調用的函數的名稱;形參值指的是當初創建函數時要求傳入的各個形參的值。需要注意的是,創建函數有多少個形參,那么調用時就需要傳入多少個值,且順序必須和創建函數時一致。即便該函數沒有參數,函數名后的小括號也不能省略。
例如,調用前面創建的那 2 個函數,執行代碼如下:- a = 6
- b = 9
- # 調用my_max()函數,將函數返回值賦值給result變量
- result = my_max(a , b) # ①
- print("result:", result)
- # 調用say_hi()函數,直接輸出函數的返回值
- print(say_hi("孫悟空")) # ②
運行上面程序,將可以看到如下運行結果:result: 9
另外,在函數體中使用 return 語句可以顯式地返回一個值,return 語句返回的值既可是有值的變量,也可是一個表達式。例如上面的 my_max() 函數,實際上也可簡寫為如下形式:
===正在執行say_hi()函數===
孫悟空,您好!- def my_max(x, y) :
- # 返回一個表達式
- return x if x > y else y
為函數提供說明文檔
前面介紹過可以使用 Python 內置的 help() 函數查看其他函數的幫助文檔,我們也經常通過 help() 函數查看指定函數的幫助信息,這對於 Python 開發者來說非常重要。
我們還可以為函數編寫說明文檔,只要把一段字符串放在函數聲明之后、函數體之前,這段字符串將被作為函數的部分,這個文檔就是函數的說明文檔。
程序既可通過 help() 函數查看函數的說明文檔,也可通過函數的 __doc__ 屬性訪問函數的說明文檔。下面程序示范了為函數編寫說明文檔:
- def my_max(x, y) :
- '''
- 獲取兩個數值之間較大數的函數。
- my_max(x, y)
- 返回x、y兩個參數之間較大的那個
- '''
- # 定義一個變量z,該變量等於x、y中較大的值
- z = x if x > y else y
- # 返回變量z的值
- return z
- # 使用help()函數查看my_max的幫助文檔
- help(my_max)
- #或者 print(my_max.__doc__)
Help on function my_max in module __main__:
my_max(x, y)
獲取兩個數值之間較大數的函數。
my_max(x, y)
返回x、y兩個參數之間較大的那個。