1. 程式人生 > 其它 >大爽Python入門教程 4-3 函式傳參 形參、實參 default、*args、**kwargs

大爽Python入門教程 4-3 函式傳參 形參、實參 default、*args、**kwargs

大爽Python入門公開課教案 點選檢視教程總目錄

1 回顧引數

先來熟悉下引數,引數在函式頭定義。
回顧一下,前兩節定義了一些函式的函式頭,
例如

  • def calculate_sum(n):
  • def show_course_average(course_name)

這些函式是需要傳參的,
n是函式calculate_sum需要的引數。
course_name是函式show_course_average需要的引數。

再例如

  • def simple_func():
    這個函式是不需要傳參的。

簡而言之,就是定義函式時,
函式頭的括號裡,定義的就是引數。

2 實參形參 parameter、argument

其實,引數對應的英文有兩個
parameter、 argument

很多地方這兩個說法是混用的,大多數時候其實也不講究。
不過這裡做教程,嚴謹的談論下這兩個。

  • parameter 是定義函式時使用的變數,
    也可以說是形式上的引數,形參(formal parameter)
  • argument 是呼叫函式時傳入的變數名,
    也可以說是實際上的引數,實參(actual argument)

舉例如下

def calculate_sum(n):  # n: parameter,形參,formal parameter
    k = 1
    s = 0
    for i in range(n):
        s += k / (i + 1)
        k = -k
    print("n=%s: S=%s" % (n, s))

a = 100
calculate_sum(a)  # a: argument,實參,actual argument

大多數時候,不產生混淆的話,都統稱為引數就好。

3 引數預設值

一般來講,parameter的數量和argument的數量需要是一樣的。
即宣告函式定義了多少個形參,
呼叫函式時就需要傳多少個實參。

但是。。。
也有偷懶的辦法。
如果一個形參,常常使用一個值,每次我們都傳一遍實參就划不來了。
省事的辦法是,在定義函式的地方,我們可以給這個引數一個預設引數值(Default Argument Values)。
如果呼叫時不寫引數,就使用預設的,
寫了引數就是用寫了的引數。

比如,這是一個非常簡單的打招呼的函式。

def greet(name, hello="Hello"):
    print("%s %s" % (hello, name))

greet("Lee")
greet("Lee", "Hi")
greet("Lee", "Welcome")

其輸出為

Hello Lee
Hi Lee
Welcome Lee

即呼叫時,不指定hello變數的值,
則使用預設引數"hello"
指定了,就是用指定的值。

4 傳參方式

呼叫函式時,傳入的實參和形參是怎麼匹配的呢?
之前的例子,都是通過位置來匹配的。
第一個實參匹配第一個形參,
第二個實參匹配第二個形參,
......

使用這樣的匹配方式的引數,也叫做positional arguments
基於位置匹配的引數,簡稱位置引數。

除了通過位置來匹配,還可以在呼叫時,使用形參名來匹配。
示例如下

def func(a, b, c):
    print("a: %s" % a)
    print("b: %s" % b)
    print("c: %s" % c)


func(c=2, b=1, a=3)

其輸出為

a: 3
b: 1
c: 2

上面這句程式碼func(c=2, b=1, a=3)
其中abc分別對應三個形參名。
等號後要傳給這些形參的實參值。

使用這樣的方式傳遞的引數,叫做keyword argument,
基於形參名匹配的引數,關鍵字引數。

這兩種可以混用,但是注意:
positional arguments必須要在keyword argument之前。

示例如下

def func(a, b, c):
    print("a: %s" % a)
    print("b: %s" % b)
    print("c: %s" % c)

func(1, 2, c=5)

當然,初學者估計會有疑惑,
這兩種傳參方式哪個好,或者說什麼時候用哪個。

這裡個人的看法是,
一般能用positional arguments就用positional arguments,
發現這個不行了或者麻煩,再用keyword argument

5 *args

在形參中,*args用於接受不定數量的位置引數positional arguments
並會將這些引數打包放在元組中

具體見下

def func(*args):
    print(args)

func()
func(1)
func(1, 2)
func(1, 2, 5)

輸出如下

()
(1,)
(1, 2)
(1, 2, 5)

注意,這裡的核心是*符號,後面的args換成別的名字也可以。

6 **kwargs

在形參中,*args用於接受不定數量的關鍵詞引數keyword argument
並會將這些引數打包放在字典中

具體見下

def func(**kwargs):
    print(kwargs)

func()
func(a=1)
func(a=1, bb=2)
func(a=1, b=2, value=5)

輸出如下

{}
{'a': 1}
{'a': 1, 'bb': 2}
{'a': 1, 'b': 2, 'value': 5}

注意,這裡的核心是**符號,後面的kwargs換成別的名字也可以。

*args**kwargs暫時不需要會用,能看懂程式碼就行。