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


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

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

如果傳一個參數調用,print_str("hello"),那么一定會拋出異常的(明確告訴你需要准確的兩個參數,現在只確定給了一個參數)

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

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

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

此時調用:print_str("hello")

輸出結果:

hello 

()

可以看到字符串"hello"打印出來了,而沒有傳參的*second,打印出的是一個元組tuple,0個元素的元組,因為我就傳了一個參數

如果我們多傳幾個參數呢:print_str("hello","one","two","three")

輸出結果:

hello 

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

果然從可變參數開始起,即第二個參數"one"開始,會作為元組的第一個元素,后面的參數也會相繼成為元組的元素。

3、總結一下 *參數

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

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

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')

5、如果是一個沒有可變參數的函數,可以用解包功能一次性傳入多個參數嗎?當然是可以的,看下例子

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

輸出結果:

1

2

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

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

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

6-1、函數調用時,也可以傳入一個字典,函數那塊會解包,它會把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'}

7、總結

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

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

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

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

注意:倆者同時存在時,一定需要將*second放在**anything之前

注意:倆者同時存在時,一定需要將*second放在**anything之前

 

8、注意事項,再提一次

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

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

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

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

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

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

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


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

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM