日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

七、Python可變參數(shù)函數(shù)用法詳解

 星光閃亮圖書館 2019-08-08
很多編程語言都允許定義個(gè)數(shù)可變的參數(shù),這樣可以在調(diào)用函數(shù)時(shí)傳入任意多個(gè)參數(shù)。Python 也不例外,在定義函數(shù)時(shí)也可以使用可變參數(shù)。

可變參數(shù),又稱不定長參數(shù),即傳入函數(shù)中的實(shí)際參數(shù)可以是任意多個(gè)。Python 定義可變參數(shù),主要有以下 2 種形式。

1) 可變參數(shù):形參前添加一個(gè) '*'

此種形式的語法格式如下所示:

*parameter

其中,parameter 表示形參名。這種形式表示接受任意多個(gè)實(shí)際參數(shù),并將其放到一個(gè)元組中。

下面程序定義了一個(gè)形參個(gè)數(shù)可變的函數(shù):
  1. # 定義了支持參數(shù)收集的函數(shù)
  2. def test(a, *books) :
  3. print(books)
  4. # books被當(dāng)成元組處理
  5. for b in books :
  6. print(b)
  7. # 輸出整數(shù)變量a的值
  8. print(a)
  9. # 調(diào)用test()函數(shù)
  10. test(5 , "C語言中文網(wǎng)" , "Python教程")
運(yùn)行上面程序,將看到如下運(yùn)行結(jié)果:

('C語言中文網(wǎng)', 'Python教程')
C語言中文網(wǎng)
Python教程
5

從上面的運(yùn)行結(jié)果可以看出,當(dāng)調(diào)用 test() 函數(shù)時(shí),books 參數(shù)可以傳入多個(gè)字符串作為參數(shù)值。從 test() 的函數(shù)體代碼來看,參數(shù)收集的本質(zhì)就是一個(gè)元組: Python 會(huì)將傳給 books 參數(shù)的多個(gè)值收集成一個(gè)元組。

Python 允許個(gè)數(shù)可變的形參可以處于形參列表的任意位置(不要求是形參列表的最后一個(gè)參數(shù)),例如如下程序:
  1. # 定義了支持參數(shù)收集的函數(shù)
  2. def test(*books ,num) :
  3. print(books)
  4. # books被當(dāng)成元組處理
  5. for b in books :
  6. print(b)
  7. print(num)
  8. # 調(diào)用test()函數(shù)
  9. test("C語言中文網(wǎng)", "Python教程", num = 20)
正如從上面程序中所看到的,test() 函數(shù)的第一個(gè)參數(shù)就是個(gè)數(shù)可變的形參,由于該參數(shù)可接收個(gè)數(shù)不等的參數(shù)值,因此如果需要給后面的參數(shù)傳入?yún)?shù)值,則必須使用關(guān)鍵字參數(shù),否則程序會(huì)把所傳入的多個(gè)值都當(dāng)成是傳給 books 參數(shù)的。

2) 可變參數(shù):形參前添加兩個(gè)'*'

這種形式的語法格式如下:

**parameter

其中,parameter 表示形參名。這種形式可以接收任意多個(gè)以關(guān)鍵字參數(shù)賦值的實(shí)際參數(shù),并將其放到一個(gè)字典中。

例如如下代碼:
  1. # 定義了支持參數(shù)收集的函數(shù)
  2. def test(x, y, z=3, *books, **scores) :
  3. print(x, y, z)
  4. print(books)
  5. print(scores)
  6. test(1, 2, 3, "C語言中文網(wǎng)" , "Python教程", 語文=89, 數(shù)學(xué)=94)
上面程序在調(diào)用 test() 函數(shù)時(shí),前面的 1、2、3 將會(huì)傳給普通參數(shù) x、y、z;接下來的兩個(gè)字符串將會(huì)由 books 參數(shù)收集成元組;最后的兩個(gè)關(guān)鍵字參數(shù)將會(huì)被收集成字典。運(yùn)行上面代碼,會(huì)看到如下輸出結(jié)果:

1 2 3
('C語言中文網(wǎng)', 'Python教程')
{'語文': 89, '數(shù)學(xué)': 94}


這里需要注意一點(diǎn),對(duì)于以上面方式定義的 test() 函數(shù),參數(shù) z 的默認(rèn)值幾乎不能發(fā)揮作用。比如按如下方式調(diào)用 test() 函數(shù):

test(1, 2, "C語言中文網(wǎng)" , "Python教程", 語文=89, 數(shù)學(xué)=94)

上面代碼在調(diào)用 test() 函數(shù)時(shí),前面的 1、2、"C語言中文網(wǎng)" 將會(huì)傳遞給普通參數(shù) x、y、z;接下來的一個(gè)字符串將會(huì)由 books 參數(shù)收集成元組;最后的兩個(gè)關(guān)鍵字參數(shù)將會(huì)被收集成字典。運(yùn)行上面代碼,會(huì)看到如下輸出結(jié)果:

1 2 C語言中文網(wǎng)
('Python教程',)
{'語文': 89, '數(shù)學(xué)': 94}


如果希望讓 z 參數(shù)的默認(rèn)值發(fā)揮作用,則需要只傳入兩個(gè)位置參數(shù)。例如如下調(diào)用代碼:

test(1, 2, 語文=89, 數(shù)學(xué)=94)

上面代碼在調(diào)用 test() 函數(shù)時(shí),前面的 1、2 將會(huì)傳給普通參數(shù) x、y,此時(shí) z 參數(shù)將使用默認(rèn)的參數(shù)值 3,books 參數(shù)將是一個(gè)空元組;接下來的兩個(gè)關(guān)鍵字參數(shù)將會(huì)被收集成字典。運(yùn)行上面代碼,會(huì)看到如下輸出結(jié)果:

1 2 3
()
{'語文': 89, '數(shù)學(xué)': 94}

逆向參數(shù)收集

所謂逆向參數(shù)收集,指的是在程序己有列表、元組、字典等對(duì)象的前提下,把它們的元素“拆開”后傳給函數(shù)的參數(shù)。逆向參數(shù)收集需要在傳入的列表、元組參數(shù)之前添加一個(gè)星號(hào),在字典參數(shù)之前添加兩個(gè)星號(hào)。例如如下代碼:
  1. def test(name, message):
  2. print("用戶是: ", name)
  3. print("歡迎消息: ", message)
  4. my_list = ['孫悟空', '歡迎來C語言中文網(wǎng)']
  5. test(*my_list)
程序中定義了一個(gè)需要兩個(gè)參數(shù)的函數(shù),而 my_list 列表包含兩個(gè)元素,為了讓程序?qū)?my_list 列表的兩個(gè)元素傳給 test() 函數(shù),程序在傳入的 my_list 參數(shù)之前添加了一個(gè)星號(hào)。

實(shí)際上,即使是可變參數(shù),如果程序需要將一個(gè)元組傳給該參數(shù),那么同樣需要使用逆向收集。例如如下代碼:
  1. def foo(name, *nums):
  2. print("name參數(shù): ", name)
  3. print("nums參數(shù): ", nums)
  4. my_tuple = (1, 2, 3)
  5. # 使用逆向收集,將my_tuple元組的元素傳給nums參數(shù)
  6. foo('fkit', *my_tuple)
上面程序中,調(diào)用將‘fkit’傳給 foo() 函數(shù)的 name 參數(shù),然后使用逆向收集將 my_tuple 包含的多個(gè)元素傳給 nums 參數(shù),nums 再將 my_tuple 的多個(gè)元素收集成元組。

運(yùn)行上面代碼,將看到如下輸出結(jié)果:

name參數(shù):  fkit
nums參數(shù):  (1, 2, 3)


此外,也可使用如下方式調(diào)用 foo() 函數(shù):
  1. # 使用逆向收集,將my_tuple元組的第一個(gè)元素傳給name參數(shù),剩下參數(shù)傳給nums參數(shù)
  2. foo(*my_tuple)
此時(shí)程序會(huì)對(duì) my_tuple 進(jìn)行逆向收集,其中第一個(gè)元素傳給 name參數(shù),后面剩下的元素傳給 nums 參數(shù)。運(yùn)行上面代碼,將看到如下輸出結(jié)果:

name參數(shù):  1
nums參數(shù):  (2, 3)


如果不使用逆向收集(不在元組參數(shù)之前添加星號(hào)),整個(gè)元組將會(huì)作為一個(gè)參數(shù),而不是將元組的元素作為多個(gè)參數(shù)。例如按如下方式調(diào)用 foo() 函數(shù):
  1. # 不使用逆向收集,my_tuple元組整體傳給name參數(shù)
  2. foo(my_tuple)
上面調(diào)用沒有使用逆向收集,因此 my_tuple 整體作為參數(shù)值傳給 name 參數(shù)。運(yùn)行上面代碼,將看到如下輸出結(jié)果:

name參數(shù):  (1, 2, 3)
nums參數(shù):  ()

 

字典也支持逆向收集,字典將會(huì)以關(guān)鍵字參數(shù)的形式傳入。例如如下代碼:

  1. def bar(book, price, desc):
  2. print(book, "VIP價(jià)格是:", price)
  3. print('描述信息', desc)
  4. my_dict = {'price': 159, 'book': 'C語言中文網(wǎng)', 'desc': '這是一個(gè)精美而實(shí)用的網(wǎng)站'}
  5. # 按逆向收集的方式將my_dict的多個(gè)key-value傳給bar()函數(shù)
  6. bar(**my_dict)
上面程序中,bar() 需要三個(gè)參數(shù)。接下來程序定義了一個(gè) my_dict 字典,該字典正好包含三個(gè) key-value 對(duì),程序使用逆向收集即可將 my_dict 包含的三個(gè) key-value 對(duì)以關(guān)鍵字參數(shù)的形式傳給 bar() 函數(shù)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多