小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

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

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

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

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

*parameter

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

下面程序定義了一個形參個數(shù)可變的函數(shù):
  1. # 定義了支持參數(shù)收集的函數(shù)
  2. def test(a, *books) :
  3. print(books)
  4. # books被當成元組處理
  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教程")
運行上面程序,將看到如下運行結(jié)果:

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

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

Python 允許個數(shù)可變的形參可以處于形參列表的任意位置(不要求是形參列表的最后一個參數(shù)),例如如下程序:
  1. # 定義了支持參數(shù)收集的函數(shù)
  2. def test(*books ,num) :
  3. print(books)
  4. # books被當成元組處理
  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ù)的第一個參數(shù)就是個數(shù)可變的形參,由于該參數(shù)可接收個數(shù)不等的參數(shù)值,因此如果需要給后面的參數(shù)傳入?yún)?shù)值,則必須使用關(guān)鍵字參數(shù),否則程序會把所傳入的多個值都當成是傳給 books 參數(shù)的。

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

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

**parameter

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

例如如下代碼:
  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ù)學=94)
上面程序在調(diào)用 test() 函數(shù)時,前面的 1、2、3 將會傳給普通參數(shù) x、y、z;接下來的兩個字符串將會由 books 參數(shù)收集成元組;最后的兩個關(guān)鍵字參數(shù)將會被收集成字典。運行上面代碼,會看到如下輸出結(jié)果:

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


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

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

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

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


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

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

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

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

逆向參數(shù)收集

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

實際上,即使是可變參數(shù),如果程序需要將一個元組傳給該參數(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 包含的多個元素傳給 nums 參數(shù),nums 再將 my_tuple 的多個元素收集成元組。

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

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


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

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


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

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

 

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

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多