大爽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)
其中a
、b
、c
分別對應三個形參名。
等號後要傳給這些形參的實參值。
使用這樣的方式傳遞的引數,叫做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
暫時不需要會用,能看懂程式碼就行。