一坝辫、在形參中使用*
和**
是比較常見的寫法
形參中使用*
和**
的原理可以參考《 * 與 ** 參數(shù)問題》這篇文章,講解非常詳細(xì)射亏,本文只作一個(gè)學(xué)習(xí)總結(jié)近忙。
-
*args
是可變參數(shù),args
接收的是一個(gè)元組智润。比如可以向一個(gè)函數(shù)傳入一個(gè)列表(或迭代器)及舍,在形參中是使用*
就可以在函數(shù)中依次接收這個(gè)列表的每一個(gè)元素; -
**kw
是關(guān)鍵字參數(shù)窟绷,kw
接收的是一個(gè)字典锯玛。比如在收集用戶信息的時(shí)候,除了必填項(xiàng)之外兼蜈,我們可以用**
來方便地接收那些未知個(gè)數(shù)的可選項(xiàng)攘残。 - 在 lambda 表達(dá)式中使用
*
和**
lambda 表達(dá)式可以當(dāng)做一個(gè)匿名函數(shù),是函數(shù)都可以傳參为狸,匿名函數(shù)的形參中也帶有使用*
和**
:
a = lambda *s: s + (2, 'g')
print(a('dd', 'de'))
# 打印出來的結(jié)果:('dd', 'de', 2, 'g')
lambda_test = lambda **args: args
print(lambda_test(usr='Obama', age=18))
# 打印出來的結(jié)果:{'usr': 'Obama', 'age': 18}
二歼郭、當(dāng)對象為迭代器時(shí),可在實(shí)參中使用*
辐棒;當(dāng)對象為一個(gè)可迭代的映射時(shí)实撒,可在實(shí)參中使用**
眾所周知,Python 中的可迭代對象分為集合數(shù)據(jù)類型(list涉瘾、tuple知态、dict、set立叛、str)和 generator 兩種负敏。
而我們常見的可迭代映射就是 dict 啦。
-
實(shí)參中的
*
會獲取可迭代對象的 key(索引/鍵值)
由于獲取的是可迭代對象的 key秘蛇,所以函數(shù)的形參可以為位置參數(shù)或可變參數(shù)其做。
- 形參為位置參數(shù)
def foo(n1, n2, n3, n4, n5):
return n1, n2, n3, n4, n5
d = {'n1': 5, 'n2': 6, 'n3': 7, 'n4': 8, 'n5': 9}
print(foo(*d))
# 打印得到的結(jié)果為 ('n1', 'n2', 'n3', 'n4', 'n5')
- 形參為可變參數(shù)
def fu(*n):
print(n)
d = {'n1': 5, 'n2': 6, 'n3': 7, 'n4': 8, 'n5': 9}
print(fu(*d))
# 打印得到的結(jié)果為 ('n1', 'n2', 'n3', 'n4', 'n5')
以上兩個(gè)例子中顶考,將實(shí)參中的字典對象換成列表、元組或者字符串對象妖泄,都是可以的驹沿,朋友們可以自己動手嘗試一下。
-
實(shí)參中的
**
會獲取可迭代映射的 value
由于獲取的是可迭代對象的 value蹈胡,所以函數(shù)的形參只能為關(guān)鍵字參數(shù)渊季,即參數(shù)的個(gè)數(shù)和名稱都是固定的。
def foo(n1, n2, n3, n4, n5):
return n1, n2, n3, n4, n5
d = {'n1': 5, 'n2': 6, 'n3': 7, 'n5': 8, 'n4': 9}
print(foo(**d))
# 打印得到的結(jié)果為(5, 6, 7, 9, 8)
如果我們要調(diào)用的函數(shù)不是關(guān)鍵字形參:
def fu(*n):
print(n)
iterator = 'unique'
print(fu(**iterator))
# 會報(bào)錯(cuò)為:TypeError: fu() argument after ** must be a mapping
如果調(diào)用函數(shù)中的關(guān)鍵字形參名稱與傳入的實(shí)參無法一一對應(yīng):
def foo(n1, n2, n3, n4, n5):
return n1, n2, n3, n4, n5
d = {'n1': 5, 'n2': 6, 'n3': 7, 'n4': 8, 'n5': 9, 'n6': 10}
print(foo(**d))
# 會報(bào)錯(cuò)為:TypeError: foo() got an unexpected keyword argument 'n6'
更多舉例說明請參考《Python 函數(shù)參數(shù)類型 罚渐、* 的區(qū)別》這篇文章却汉。