在用戶定義的函數(shù)文章中,我們學(xué)習(xí)了有關(guān)定義函數(shù)并調(diào)用函數(shù)的知識(shí)。如果不清楚函數(shù)調(diào)用方式,將導(dǎo)致不可預(yù)知的錯(cuò)誤。下面是一個(gè)示例。
def greet(name, msg): """這個(gè)一個(gè)打招呼的函數(shù) 有name,msg兩個(gè)參數(shù)""" print("Hello", name + ', ' + msg) greet("Monica", "Good morning!")
輸出結(jié)果
Hello Monica, Good morning!
函數(shù)greet()具有兩個(gè)參數(shù)。
由于我們已經(jīng)使用兩個(gè)參數(shù)調(diào)用了此函數(shù),因此該函數(shù)運(yùn)行正常,并且沒(méi)有任何錯(cuò)誤。
如果使用不同數(shù)量的參數(shù)調(diào)用它,則解釋器將顯示錯(cuò)誤消息。下面是對(duì)此函數(shù)的調(diào)用,演示了只使用一個(gè)參數(shù)和使用沒(méi)有參數(shù)調(diào)用后,運(yùn)行后它們各自拋出的錯(cuò)誤消息。
>>> greet("Monica") # 只給傳一個(gè)參數(shù) TypeError: greet() missing 1 required positional argument: 'msg'
>>> greet() # 沒(méi)有傳入任何參數(shù) TypeError: greet() missing 2 required positional arguments: 'name' and 'msg'
到目前為止,函數(shù)具有固定數(shù)量的參數(shù)。在Python中,還有其他方法來(lái)定義可以采用可變數(shù)量的參數(shù)的函數(shù)。
下面介紹這種類型的三種不同形式。
在Python中函數(shù)參數(shù)可以具有默認(rèn)值。
我們可以使用賦值運(yùn)算符(=)為參數(shù)提供默認(rèn)值。這是一個(gè)示例。
def greet(name, msg="早上好!"): """ 此函數(shù)向提供消息的人打招呼。 如果沒(méi)有提供消息, 則默認(rèn)為“早上好!” """ print("你好", name + ', ' + msg) greet("張三") greet("李四", "最近怎么樣?")
輸出結(jié)果
你好 張三, 早上好! 你好 李四, 最近怎么樣?
在此函數(shù)中,參數(shù)name沒(méi)有默認(rèn)值,那么在調(diào)用此函數(shù)時(shí),name參數(shù)必須要傳值(強(qiáng)制性的)。
另一方面,該參數(shù)msg的默認(rèn)值為"Good morning!"。因此,在調(diào)用函數(shù)時(shí)可以不傳值。如果調(diào)用時(shí)提供了一個(gè)值,它將會(huì)覆蓋默認(rèn)值。
函數(shù)中的任意數(shù)量的參數(shù)都可以具有默認(rèn)值。但是一旦有了默認(rèn)參數(shù),其右邊的所有參數(shù)也必須具有默認(rèn)值。
這意味著非默認(rèn)參數(shù)不能跟隨默認(rèn)參數(shù)。例如,如果我們將上面的函數(shù)頭定義為:
def greet(msg = "Good morning!", name):
我們將收到以下錯(cuò)誤消息:
SyntaxError: non-default argument follows default argument
當(dāng)我們調(diào)用帶有某些值的函數(shù)時(shí),這些值將根據(jù)其位置分配給參數(shù)。
例如,在上面的函數(shù)greet(),當(dāng)我們把它叫做是greet("Bruce", "How do you do?"),該值"Bruce"被分配給參數(shù)name,而"How do you do?"以被分配給msg。
Python允許使用關(guān)鍵字參數(shù)調(diào)用函數(shù)。當(dāng)我們以這種方式調(diào)用函數(shù)時(shí),參數(shù)的順序(位置)可以更改。對(duì)上述函數(shù)的后續(xù)調(diào)用均有效,并產(chǎn)生相同的結(jié)果。
# 2個(gè)關(guān)鍵詞參數(shù) greet(name = "Bruce",msg = "How do you do?") # 2個(gè)關(guān)鍵詞參數(shù),參數(shù)順序調(diào)換 greet(msg = "How do you do?",name = "Bruce") #1 個(gè)位置參數(shù), 1 個(gè)關(guān)鍵詞參數(shù) greet("Bruce", msg = "How do you do?")
如我們所見(jiàn),我們可以在函數(shù)調(diào)用期間將位置參數(shù)與關(guān)鍵字參數(shù)混合。但是我們必須記住,關(guān)鍵字參數(shù)必須跟隨位置參數(shù)。
在關(guān)鍵字參數(shù)之后放置位置參數(shù)會(huì)導(dǎo)致錯(cuò)誤。例如,函數(shù)調(diào)用如下:
greet(name="Bruce","How do you do?")
會(huì)導(dǎo)致錯(cuò)誤:
SyntaxError: non-keyword arg after keyword arg
有時(shí),我們事先不知道將傳遞給函數(shù)的參數(shù)數(shù)量。Python允許我們通過(guò)帶有任意數(shù)量參數(shù)的函數(shù)調(diào)用來(lái)處理這種情況。
在函數(shù)定義中,我們?cè)趨?shù)名稱前使用星號(hào)(*)表示此類參數(shù)。這是一個(gè)示例。
def greet(*names): """此函數(shù)被打招呼的對(duì)象為 元組列表中的所有人.""" # 名稱是一個(gè)帶有參數(shù)的元組 for name in names: print("Hello", name) greet("Monica", "Luke", "Steve", "John")
輸出結(jié)果
Hello Monica Hello Luke Hello Steve Hello John
在這里,我們調(diào)用了帶有多個(gè)參數(shù)的函數(shù)。這些參數(shù)在傳遞給函數(shù)之前被包裝為一個(gè)元組。在函數(shù)內(nèi)部,我們使用for循環(huán)來(lái)取回所有參數(shù)。