Python函式引數

在本節中,我們將來學習Python函式引數,及其不同型別的引數,例如預設引數,關鍵字引數和任意引數。

Python函式引數:

函式的引數是在函式內需要呼叫該函式時輸入的值。當定義的函式具有指定數量引數,呼叫此特定函式時必須傳遞指定數量的引數。

如果傳遞的引數多於或少於函式定義中指定的引數,則會得到一個錯誤-TypeError

我們舉下面的例子,

def language(p, n):
    """Function to print a message"""
    print("Programming language",n,"is:", p)
language('Python', 1)
language('Java', 2)
Programming language 1 is: Python
Programming language 2 is: Java

函式language有兩個引數。如果呼叫函式時傳遞不同數量的引數,則會出現如下錯誤:

>>> language('Python')

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    language('Python')
TypeError: language() takes exactly 2 arguments (1 given)

>>> language(2, 'Python', 'Java')

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    language(2, 'Python', 'Java')
TypeError: language() takes exactly 2 arguments (3 given)

Python函式引數型別:

上面介紹的函式具有固定數量的引數。函式也可以有可變的引數,將可變引數傳遞給函式有三種不同的方法,現在我們來逐一介紹。

Python函式預設引數:

在函式中,引數可以有在函式定義中指定的預設值。如果引數有預設值,那麼它是輸入引數中可選的值。

我們先來看下面的例子,

def language(p = 'C++', n = 3):
    """Function to print a message"""
    print("Programming language",n,"is:", p)
language()
Programming language 3 is: C++

你可以在看到這裡沒有傳遞任何輸入引數,但程式仍然能執行,這是因為函式定義的時候提供了引數的預設值。如果你傳入了這些預設引數的不同的值,則將覆蓋預設值。

Python函式關鍵字引數:

通常情況下,你需要按照函式定義中定義的引數順序來傳遞多個引數。但是如果使用關鍵字引數,則可以更改引數的位置。

下面的例子是順序輸入引數的情形,

def language(p, n):
    """Function to print a message"""
    print("Programming language",n,"is:", p)
language(p = 'C++', n = 3)
Programming language 3 is: C++

如果使用關鍵字引數將值明確的賦給特定引數,那就可以更改引數的位置。 比如,

def language(p, n):
    """Function to print a message"""
    print("Programming language",n,"is:", p)
language(n = 3, p = 'C++')
Programming language 3 is: C++

Python函式任意引數:

假如事先不知道應該傳遞多少個引數,那可以來使用任意引數。任意引數在引數名稱前用星號*來表示。它將不是關鍵字引數的其他引數作為元組傳遞給函式。

def language(*args):
    """Demo function of arbitray arguments"""
    for i in args:
        print("Programming language:", i)

language("Java", "C++", "R", "Kotlin")
Programming language: Java
Programming language: C++
Programming language: R
Programming language: Kotlin

這個函式在呼叫的時候,傳遞了多個引數,這些引數在函式被真正呼叫前被轉換成了一個元組。

雙星號 **kwargs 是用來傳遞任意的關鍵字引數,比如,

def language(**kwargs):
    """Demo funciton of arbitrary keyword arguments"""
    for a in kwargs:
        print(a, kwargs[a])
        
language(country="NL", code="+31")
country NL
code +31

任意關鍵字引數中的引數是作為字典傳遞的,該字典的鍵是關鍵字,字典值是對應的引數的值。比如上面的示例中,傳遞的引數將轉換為字典{'country':"NL", 'code':"+31"}