Python之可變參數,*參數,**參數,以及傳入*參數,進行解包

1.定義了一個須要兩個參數的函數javascript

def print_str(first, second):
    print first
    print second
 
if __name__ == "__main__":
    print_str("hello", "world")

若是傳一個參數調用,print_str("hello"),那麼必定會拋出異常的(明確告訴你須要準確的兩個參數,如今只肯定給了一個參數)java

TypeError: print_str() takes exactly 2 arguments (1 given)python

二、上面的問題,咱們有個需求,就是我想傳一個參數也行(還有種辦法是用到默認參數),傳兩個參數或多個參數也行的函數有沒有?像java同樣,必須的有,讓咱們改造一下最後參數爲可變參數(也就是說可變參數,你能夠不傳)函數

def print_str(first, *second):
    print first
    print second

此時調用:print_str("hello")ui

輸出結果:spa

hello .net

()code

能夠看到字符串"hello"打印出來了,而沒有傳參的*second,打印出的是一個元組tuple,0個元素的元組,由於我就傳了一個參數對象

若是咱們多傳幾個參數呢:print_str("hello","one","two","three")blog

輸出結果:

hello 

('one', 'two', 'three')

果真從可變參數開始起,即第二個參數"one"開始,會做爲元組的第一個元素,後面的參數也會相繼成爲元組的元素。

三、總結一下 *參數

在調用時,從*參數 起,對傳入的參數,自動組成tuple。

四、函數調用時,傳入*參數,會對傳入的元組參數進行一個解包功能,每個元素自動做爲函數的參數

print_str(*numbers_strings),傳入*元組,看看是怎麼解包的,元組的第一個元素,仍然是表明位置參數first

等同於print_str("1","2","3","4","5")

numbers_strings = ("1","2","3","4","5")
 
def print_str(first, *second):
    print first
    print second
 
if __name__ == "__main__":
    print_str(*numbers_strings)

輸出結果:

1

('2', '3', '4', '5')

五、若是是一個沒有可變參數的函數,能夠用解包功能一次性傳入多個參數嗎?固然是能夠的,看下例子

numbers_strings = ("1","2")
 
def print_str(first, second):
    print first
    print second
 
if __name__ == "__main__":
    print_str(*numbers_strings)

輸出結果:

1

2

六、慚愧啊,漏掉了 **參數,參數名稱前兩個**,表明的是關鍵字參數,也叫作字典參數,看下例子

def printStr(**anything):
    print anything
 
printStr(first = 5, second = 100)

輸出結果:{'second': 100, 'first': 5}

6-一、函數調用時,也能夠傳入一個字典,函數那塊會解包,它會把dictionary中全部鍵值對轉換爲關鍵字參數傳進去

def printStr(first, **dict):
    print(first)
    print(dict)
printDic = {"name": "tyson", "age":"99"}
printStr(100, **printDic)
printStr(100, name = "tyson", age = "99") #等同於上面**printDic

輸出結果:

100
{'name': 'tyson', 'age': '99'}
100
{'name': 'tyson', 'age': '99'}

七、總結

在python中,當*和**符號同時出如今函數定義的參數中時,都表示參數列表可接受任意數量的參數,均是可變參數

*second表示任意多個(包含0個)無名參數,也稱爲元組參數,最終的類型爲tuple(注意:就算傳遞一個元素,也會最終變爲tuple)

**anything表示任意多個關鍵字參數,也稱爲字典參數,最終的類型爲dictionary

注意:倆者同時存在時,必定須要將*second放在**anything以前 (重要的事情說三遍)

注意:倆者同時存在時,必定須要將*second放在**anything以前

注意:倆者同時存在時,必定須要將*second放在**anything以前

 

八、注意事項,再提一次

a、首先只要是可變參數(無名參數或者關鍵字參數),能夠傳0個參數,也能夠傳1個,一樣也能夠傳多個

b、只要是可變參數(元組參數或者字典參數),必定要在普通參數(也稱位置參數)的後面

c、*參數必定必須在**參數的前面(元組參數與字典參數同時存在時,元組參數必定在前)

d、*參數,雖然叫元組參數,你可別傳個完整的元組對象進來哈,若是是個元組,記得作解封,否則就要背鍋了,就是要這樣*turple傳進去

e、**參數,雖然叫字典參數,你可別傳個完整的字典對象進來哈,若是是個字典,記得也是作解包,對,就是要這樣 **dict傳進去

f、*參數,叫元組參數,若是傳一個參數進去,它也去最終組成turple,這點要注意了,我今天差點看源碼懵逼了

g、**參數,我相信字典參數也同樣,傳一個進去的時候,一樣最終也會轉換爲dict


原文連接:https://blog.csdn.net/cadi2011/article/details/84871401

相關文章
相關標籤/搜索