當我們編寫函式時,我們定義了一些佔位符,這些佔位符是引數,是函式定義中用來接收外部傳遞值的佔位符,這將有助於我們在呼叫函式時接收外部傳遞的值。 在Python中,有各種型別的引數,包括位置引數、預設引數、關鍵字引數、變數位置引數、變數關鍵字引數和強制關鍵字引數。
位置引數是最常見的引數型別,也是預設引數型別。 它們按照它們在函式定義中的顯示順序傳遞,並且在呼叫函式時必須按順序提供。
def greet(name, message):
print(message, name)
greet("alittle", "hello"輸出:hello alittle
預設引數是那些在定義函式時具有預設值的引數,並且在呼叫函式時,如果沒有為引數提供特定值,則預設值將用作引數的值。 通過設定引數的預設值,可以使函式在某些情況下更加靈活和易於使用。 如果呼叫函式時未提供該引數的值,則該函式將使用預設值,否則將使用傳遞給該引數的值。
def greet(name, message="hello"):
print(message, name)
使用預設引數呼叫函式。
greet("alittle"輸出:hello alittle
傳遞特定引數值將呼叫該函式。
greet("kobe", "hi"輸出: Hi Kobe
需要注意的是,在Python中,預設引數是從左到右依次設定的,如果要為第乙個引數設定預設值,則必須確保它位於以下引數之前。 也就是說,要設定倒數第二個引數的預設值,必須首先為倒數第二個引數設定預設值。
def greet(name="iverson", message):
print(message, name)
由於第乙個引數具有預設值,因此只能傳遞第二個引數。
greet("kobe")
執行上述示例時,報錯資訊:
file "d:\program files\jetbrains\pycharmprojects\hello.py", line 33
def greet(name="iverson", message):
syntaxerror: non-default argument follows default argument
嘗試為第乙個引數設定預設值時發生語法錯誤。 這是因為在定義函式時,預設引數只能放在非預設引數之後。 所以如果我們想為第乙個引數設定乙個預設值,我們可以考慮使用關鍵字引數來傳遞引數值,或者兩個引數可以顛倒過來。
關鍵字引數是一種在呼叫函式時使用引數名稱指定引數值的方法。 使用關鍵字引數可以使函式呼叫更清晰、更易讀,尤其是當函式具有多個引數並且它們具有相同的資料型別或預設值時。
例如,上面的預設引數示例:
def greet(name, message):
print(message, name)
使用關鍵字引數呼叫函式。
greet(name="iverson", message="hello"輸出:hello iverson
greet(message="hi", name="kobe"輸出: Hi Kobe
在上面的示例中,我們在呼叫函式時通過引數名稱指定了引數值。 這不僅可以準確傳遞引數,還可以使函式呼叫的意圖更清晰、更易於理解。 即使將函式定義中的第乙個引數設定為預設值,也不會進行糾錯。
因此,您可以使用關鍵字參數顯式指定引數名稱,這樣可以避免因引數順序錯誤而導致的錯誤。 並且只將值傳遞給您關心的引數,而忽略其他引數。 在呼叫函式時提供更好的可讀性和可維護性。
可變長度位置引數是一種屬性,它允許函式接受任意數量的位置引數。 定義函式時,使用星號 (*) 作為字首來表示變數位置引數。 它將所有傳入的位置引數打包到乙個元組中。 定義函式後,我們可以在引數列表中使用 *args 來接收這些引數。
def calculate_sum(*numbers):
total = 0
for num in numbers:
total += num
return total
print(計算總和(1, 2, 3)) 輸出: 6
print(calculate sum(4, 5, 6, 7, 8)) 輸出: 30
同樣重要的是要注意,可變位置引數放在其他引數之後。 也就是說,函式定義中首先定義的引數將按位置順序讀取引數的值,而變數位置引數將讀取所有剩餘的引數。 例如,如果你想這樣寫,你會得到乙個錯誤:
def calculate_sum(*numbers, message):
total = 0
for num in numbers:
total += num
return message, total
result = calculate_sum(1, 2, 3, "sum=")
print(result)
如果執行它,將報告以下錯誤。
traceback (most recent call last):
file "d:\program files\jetbrains\pycharmprojects\hello.py", line 40, in
result = calculate_sum( 1, 2, 3, "sum=")
typeerror: calculate_sum() missing 1 required keyword-only argument: 'message'
變數關鍵字引數是通過使用 ** 字首來定義的,以接收任意數量的關鍵字引數。 有點類似於鍵值格式,它會將所有傳入的關鍵字引數打包到乙個字典(dict)中,可以使用鍵值對在函式內部訪問該字典。
def calculate_sum(*args, *kwargs):
total = sum(args)
for key, value in kwargs.items():
total += value
return total
result = calculate_sum(1, 2, 3, num1=4, num2=5)
print(result) 輸出: 15
在此示例中,calculate_sum
函式接受可變位置引數args
和可變關鍵字引數kwargs
。可變位置引數args
用於接收任意數量的位置引數,同時變數關鍵字引數可用kwargs
用於接收任意數量的關鍵字引數。 在函式內部,我們首先使用calculate_sum
功能對可變位置引數args
做乙個總結。 然後,我們遍歷變數關鍵字引數kwargs
將關鍵字引數的值相加到總和。
變數關鍵字引數提供了一種靈活的方法來處理不確定數量的關鍵字引數,並為函式提供更大的可伸縮性和適應性。
必需的僅關鍵字引數位於 3在版本 1 之後引入,意味著在定義函式時,使用 * 字尾來限制呼叫函式時關鍵字引數的使用,不允許使用位置引數。
def greet(*,name, message):使用分隔符“*”指示必須使用關鍵字傳遞以下引數。
print(message, name)
greet(name="alittle", message="hi") 關鍵字引數傳遞。
greet("kobe", "hi")
第一次通話greet
沒問題,但第二名叫greet
它將引發異常並報告錯誤。
traceback (most recent call last):
file "d:\program files\jetbrains\pycharmprojects\hello.py", line 39, in
message = greet("kobe", "hi")
typeerror: greet() takes 0 positional arguments but 2 were given
通過使用必填關鍵字引數,我們可以清楚地傳達引數的含義,避免混淆引數的位置,並提高引數的可讀性和魯棒性。