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