python函式引數型別之位置引數、預設引數、動態引數、關鍵字引數
阿新 • • 發佈:2021-10-11
Python函式引數列表
1、位置引數:呼叫函式的時候傳的引數,引數預設按順序賦值;但是如果是指定對某個引數賦值,不關注順序。
2、預設引數:在定義函式的時候,給某個引數設定預設值 。
3、動態引數:*args 呼叫函式是可以傳入任意個引數或者不傳,傳遞到函式內部會把這些函式存入到一個元組。
4、關鍵字引數:**kwargs 引數傳遞進去後變成一個字典型別儲存。
必傳引數(位置引數)
def add(a, b): return a + b sum = add(1, 2) print(sum) # 輸出結果 3
- add 函式有兩個引數,第一個引數是 a,第二個引數是 b
- 傳入的兩個整數按照位置順序依次賦給函式的引數 a 和 b,引數 a 和引數 b 被稱為位置引數
傳遞的引數個數必須等於引數列表的數量
- 根據函式定義的引數位置來傳遞引數,要求傳遞的引數與函式定義的引數兩者一一對應
- 如果 “傳遞的引數個數” 不等於 “函式定義的引數個數”,執行時會報錯
# 錯誤示例 def add(a, b): return a + b sum = add(1, 2, 3) # 輸出結果 sum = add(1, 2, 3) E TypeError: add() takes 2 positional arguments but 3 were given
預設引數
使用預設引數,可以簡化函式的呼叫,尤其是在函式需要被頻繁呼叫的情況下:
# 必傳引數a,預設引數b def test1(a, b=3): print(a, b) test1(0) test1(0, 1)
執行結果:
0 3
0 1
宣告函式時,當同時存在必傳引數和預設引數,形參的順序必須是 (必傳引數 , 預設引數),即不能預設引數在前。
可變引數【又可叫做:動態引數】
為什麼會需要可變引數
假設需要一個 2 個數的求和函式
def add(a, b): return a + b add(1, 2)
此時,有需要一個 3 個數的求和函式
def add3(a, b, c):return a + b + c add3(1, 2, 3)
問題來了:
- 那麼,如果還需要一個 4 個數的求和函式,可以通過上述方式再加一個函式,但顯然很麻煩
- 所以,可變引數誕生了
- 希望只編寫一個計算求和的函式 add,但函式的引數個數是不確定的,這樣就可以複用了
可變引數的表示方式
def 函式(*args): 函式體
- 該函式被設定為能夠接受可變數量的引數
- args 的型別是元組
- 呼叫該函式時,所有的引數被合併成一個元組
- 合併後的元組被賦值給 args,通過遍歷 args 可以訪問傳遞的引數
舉例說明1:
# 累加的可變引數函式 def add(*args): print(args) sum = 0 for arg in args: sum += arg print('len = %d, sum = %d' % (len(args), sum)) add(1) add(1, 2) add(1, 2, 3) # 輸出結果 (1,) len = 1, sum = 1 (1, 2) len = 2, sum = 3 (1, 2, 3) len = 3, sum = 6
舉例說明2:
def test2(num, num2=2, *args): print(num, num2, args) test2(1) test2(1, 3) test2(1, 3, 3, 3, 3, 3, 3) test2(1, *(2, 3, 4, 5)) test2(1, *[2, 3, 4, 5])
執行結果:
1 2 () 1 3 () 1 3 (3, 3, 3, 3, 3) 1 2 (3, 4, 5) 1 2 (3, 4, 5)
知識點
- args是一個元組型別
- 可變引數可不傳,也可以傳很多個值
- *(2, 3, 4, 5),在元組or列表前面加一個*,代表將裡面的每個元素獨立出來,單獨作為一個形參傳進去,也稱為元組解包。(python解包詳細可檢視:https://www.cnblogs.com/hls-code/p/15227567.html)
【注意】:①在函式呼叫時,可變引數之前的引數不能指定引數名;且必傳引數不管在函式宣告時或函式呼叫時都必須位於可變引數之前
例如:
# 可變引數 def myfun(a, *b): print(a) print(b) myfun(a=1, 2, 3, 4) # 輸出結果 myfun(a=1, 2, 3, 4) ^ SyntaxError: positional argument follows keyword argument
【注意】:②函式呼叫時,可變引數(*
)之後的引數必須指定引數名【即關鍵字傳參】,否則就會被歸到可變引數之中
例如1:
# 可變引數 def myfun(a, *b, c=None): print(a) print(b) print(c) myfun(1, 2, 3, 4) # 輸出結果 1 (2, 3, 4) None
c 輸出了 None ,即沒有拿到引數值。
例如2關鍵字傳參:
# 可變引數 def myfun(a, *b, c=None): print(a) print(b) print(c) myfun(1, 2, 3, c=4) # 輸出結果 1 (2, 3) 4
關鍵字引數
什麼是關鍵字引數?
Python 允許呼叫函式時,以 “引數名 = 引數值” 的形式傳遞引數。
def add(a, b): return a + b add(a = 1, b = 2)
"引數名 = 引數值" 形式的引數,例如 a = 1 和 b = 2,被稱為關鍵字引數。
包含關鍵字引數的函式語法格式
在引數前加上符號**引數表示函式可以接收關鍵字引數
def 函式(**kwargs): 函式體
- 該函式被設定為能夠接收關鍵字引數
- kwargs的型別是字典
- 呼叫該函式時,所有的關鍵字引數被合併成一個字典
- 合併後的字典被賦值給 kwargs,通過訪問kwargs 可以訪問引數名和引數值
舉例1:
# 關鍵字引數函式舉例 def create_full_name(**kwargs): # 列印就是一個字典 print(kwargs) name = kwargs.get("name") password = kwargs.get("password") if name and password: print("name is :", name, " and password is :", password) if name and not password: print("only name is:", name) # 方式一:通過 key=value 的方式傳參 create_full_name(name="小菠蘿", password="123456") dict_ = {"name": "yy"} # 方式二:傳字典,然後加 ** 進行解包 create_full_name(**dict_) # 輸出結果 {'name': '小菠蘿', 'password': '123456'} name is : 小菠蘿 and password is : 123456 {'name': 'yy'} only name is: yy
舉例2:
def test3(a, b=2, **kwargs): print(a, b, kwargs) test3(1) test3(1, 3) test3(1, **{"key": "value"}) test3(1, 3, **{"key": "value", "key1": "val", "key2": 'val2'}) test3(1, name="yy", key="value") test3(1, 3, name="yy", key="value") test3(1, name="yy", key="value",b=222222) # test3(1, 22222,name="yy", key="value",b=222222) 會報錯,因為第二個值已經傳給預設引數b了
執行結果:
1 2 {} 1 3 {} 1 2 {'key': 'value'} 1 3 {'key': 'value', 'key1': 'val', 'key2': 'val2'} 1 2 {'name': 'yy', 'key': 'value'} 1 3 {'name': 'yy', 'key': 'value'} 1 222222 {'name': 'yy', 'key': 'value'}
知識點
- kwargs 是一個字典型別
- 關鍵字引數可傳可不傳
- 傳值的時候需要傳鍵值對,如果要傳dict需要在前面加上**,表示將這個dict的所有key-value當成獨立的關鍵字引數(變成 key = value)傳入到 kwargs,而修改 kwargs不會影響原來的 dict
- 不用 dict 的話也可以直接key=value的寫法,如果和預設引數重名,若前面沒有傳值的話,會當成預設引數傳值;若有的話會直接報錯(函式宣告時不允許引數重複)。
- 宣告函式時,預設引數不可以放在關鍵字引數後面,即預設引數必須位於關鍵字引數之前
- **dict ,也叫字典解包
舉例
python的requests庫關鍵字函式(如果某個python函式的引數為關鍵字引數,則該函式可以被叫做關鍵字函式)
https://www.cnblogs.com/poloyy/p/12526592.html
去期待陌生,去擁抱驚喜。