函數是重用的程式段。它們允許你給一塊語句一個名稱,然後你可以在你的程式的任何地方使用這個名稱任意多次地運行這個語句塊。這被稱為 調用 函數。我們已經使用了許多內建的函數,比如len和range。
函數通過def關鍵字定義。def關鍵字後跟一個函數的 標識符 名稱,然後跟一對圓括弧。圓括弧之中可以包括一些變數名,該行以冒號結尾。接下來是一塊語句,它們是函數體。下面這個例子將說明這事實上是十分簡單的:
定義函數
例1 定義函數
#!/usr/bin/python# Filename: function1.pydef sayHello(): print('Hello World!') # block belonging to the functionsayHello() # call the function
輸出:
Hello World!
函數形參
函數取得的參數是你提供給函數的值,這樣函數就可以利用這些值 做 一些事情。這些參數就像變數一樣,只不過它們的值是在我們調用函數的時候定義的,而非在函數本身內賦值。
參數在函數定義的圓括弧對內指定,用逗號分割。當我們調用函數的時候,我們以同樣的方式提供值。注意我們使用過的術語——函數中的參數名稱為 形參 而你提供給函數調用的值稱為 實參 。
使用函數形參
例2 使用函數形參
#!/usr/bin/python# Filename: func_param.pydef printMax(a, b): if a > b: print(a, 'is maximum') else: print(b, 'is maximum')printMax(3, 4) # directly give literal valuesx = 5y = 7printMax(x, y) # give variables as arguments
輸出:
4 is maximum
7 is maximum
這裡,我們定義了一個稱為printMax的函數,這個函數需要兩個形參,叫做a和b。我們使用if..else語句找出兩者之中較大的一個數,並且列印較大的那個數。
在第一個printMax使用中,我們直接把數,即實參,提供給函數。在第二個使用中,我們使用變數調用函數。
printMax(x, y)使實參x的值賦給形參a,實參y的值賦給形參b。在兩次調用中,printMax函數的工作完全相同。
局部變數
當你在函數定義內聲明變數的時候,它們與函數外具有相同名稱的其他變數沒有任何關係,即變數名稱對於函數來說是 局部 的。
這稱為變數的 範圍 。所有變數的範圍是它們被定義的塊,從它們的名稱被定義的那點開始。
使用局部變數
例3 使用局部變數
#!/usr/bin/python# Filename: func_local.pydef func(x): print('x is', x) x = 2 print('Changed local x to', x)x = 50func(x)print('x is still', x)
輸出
x is 50
Changed local x to 2
x is still 50
在函數中,我們第一次使用x的 值 的時候,Python使用函式宣告的形參的值。
接下來,我們把值2賦給x。x是函數的局部變數。所以,當我們在函數內改變x的值的時候,在主塊中定義的x不受影響。
在最後一個print語句中,我們證明了主塊中的x的值確實沒有受到影響。
使用global語句
如果你想要為一個定義在函數外的變數賦值,那麼你就得告訴Python這個變數名不是局部的,而是 全域 的。
我們使用global陳述式完成這一功能。沒有global語句,是不可能為定義在函數外的變數賦值的。
你可以使用定義在函數外的變數的值(假設在函數內沒有同名的變數)。但是應該盡量避免這樣做,因為這使得程式的讀者會不清楚這個變數是在哪裡定義的。
使用global語句可以清楚地表明變數是在外面的塊定義的。
例4 使用global語句
#!/usr/bin/python# Filename: func_global.pydef func(): global x print('x is', x) x = 2 print('Changed local x to', x)x = 50func()print('Value of x is', x)
輸出
x is 50
Changed global x to 2
Value of x is 2
它如何工作
global語句被用來聲明x是全域的——因此,當我們在函數內把值賦給x的時候,這個變化也反映在我們在主塊中使用x的值的時候。
你可以使用同一個global語句指定多個全域變數。例如global x, y, z。
預設參數值
對於一些函數,你可能希望它的一些參數是 可選 的,如果使用者不想要為這些參數提供值的話,這些參數就使用預設值。
這個功能藉助於預設參數值完成。你可以在函數定義的形參名後加上賦值運算子(=)和預設值,從而給形參指定預設參數值。
注意,預設參數值應該是一個參數。更加準確的說,預設參數值應該是不可變的——這會在後面的章節中做詳細解釋。從現在開始,請記住這一點。
使用預設參數值
例5 使用預設參數值
#!/usr/bin/python# Filename: func_default.pydef say(message, times = 1): print(message * times)say('Hello')say('World', 5)
輸出
Hello
WorldWorldWorldWorldWorld
它如何工作
名為say的函數用來列印一個字串任意所需的次數。如果我們不提供一個值,那麼預設地,字串將只被列印一遍。我們通過給形參times指定預設參數值1來實現這一功能。
在第一次使用say的時候,我們只提供一個字串,函數只列印一次字串。在第二次使用say的時候,我們提供了字串和參數5,表明我們想要 說 這個字串訊息5遍。
只有在形參表末尾的那些參數可以有預設參數值,即你不能在聲明函數形參的時候,先聲明有預設值的形參而後聲明沒有預設值的形參。
這是因為賦給形參的值是根據位置而賦值的。例如,def func(a, b=5)是有效,但是def func(a=5, b)是 無效 的。
關鍵參數
如果你的某個函數有許多參數,而你只想指定其中的一部分,那麼你可以通過命名來為這些參數賦值。
這被稱作 關鍵參數
,我們使用名字(關鍵字)而不是位置(我們前面所一直使用的方法)來給函數指定實參。
這樣做有兩個 優勢 :
一,由於我們不必擔心參數的順序,使用函數變得更加簡單了。
二、假設其他參數都有預設值,我們可以只給我們想要的那些參數賦值。
使用關鍵參數
例6 使用關鍵參數
#!/usr/bin/python# Filename: func_key.pydef func(a, b=5, c=10): print('a is', a, 'and b is', b, 'and c is', c)func(3, 7)func(25, c=24)func(c=50, a=100)
輸出:
a is 3 and b is 7 and c is 10
a is 25 and b is 5 and c is 24
a is 100 and b is 5 and c is 50
它如何工作
名為func的函數有一個沒有預設值的參數,和兩個有預設值的參數。
在第一次使用函數的時候, func(3, 7),參數a得到值3,參數b得到值7,而參數c使用預設值10。
在第二次使用函數func(25, c=24)的時候,根據實參的位置變數a得到值25。根據命名,即關鍵參數,參數c得到值24。變數b根據預設值,為5。
在第三次使用func(c=50, a=100)的時候,我們使用關鍵參數來完全指定參數值。注意,儘管函數定義中,a在c之前定義,我們仍然可以在a之前指定參數c的值。
return語句
return語句用來從一個函數 返回 即跳出函數。我們也可選從函數 返回一個值 。
使用字面意義上的語句
例7 使用字面意義上的語句
#!/usr/bin/python# Filename: func_return.pydef maximum(x, y): if x > y: return x else: return yprint(maximum(2, 3))
輸出
3
它如何工作
maximum函數返回參數中的最大值,在這裡是提供給函數的數。它使用簡單的if..else語句來找出較大的值,然後 返回 那個值。
注意,沒有傳回值的return語句等價於return None。None是Python中表示沒有任何東西的特殊類型。例如,如果一個變數的值為None,可以表示它沒有值。
除非你提供你自己的return語句,每個函數都在結尾暗含有return None語句。通過運行print someFunction(),你可以明白這一點,函數someFunction沒有使用return語句,如同:
def someFunction():
pass
pass語句在Python中表示一個空的語句塊。
DocStrings
Python有一個很奇妙的特性,稱為 文檔字串 ,它通常被簡稱為 docstrings 。DocStrings是一個重要的工具,由於它協助你的程式文檔更加簡單易懂,你應該盡量使用它。你甚至可以在程式啟動並執行時候,從函數恢複文檔字串!
使用DocStrings
例8 使用DocStrings
#!/usr/bin/python# Filename: func_doc.pydef printMax(x, y): ''' Prints the maximum of two numbers. The two values must be integers. ''' x = int(x) # convert to integers, if possible y = int(y) if x > y: print(x, 'is maximum') else: print(y, 'is maximum')printMax(3, 5)print(printMax.__doc__)
輸出
$ python func_doc.py
5 is maximum
Prints the maximum of two numbers.
The two values must be integers.
它如何工作
在函數的第一個邏輯行的字串是這個函數的 文檔字串 。注意,DocStrings也適用於模組和類。
文檔字串的慣例是一個多行字串,它的首行以大寫字母開始,句號結尾。第二行是空行,從第三行開始是詳細的描述。 強烈建議 你在你的函數中使用文檔字串時遵循這個慣例。
你可以使用__doc__(注意雙底線)調用printMax函數的文檔字串屬性(屬於函數的名稱)。
如果你已經在Python中使用過help(),那麼你已經看到過DocStings的使用了!它所做的只是抓取函數的__doc__屬性,然後整潔地展示給你。你可以對上面這個函數嘗試一下——只是在你的程式中包括help(printMax)。記住按q退出help。
自動化工具也可以以同樣的方式從你的程式中提取文檔。因此,建議對所寫的任何正式函數編寫文檔字串。隨你的Python發行版附帶的pydoc命令,與help()類似地使用DocStrings。