函數的參數
在定義Python函數時可定義形參,這些參數在調用時候才能確定具體的值,由函數的調用者負責為行參傳入參數值
函數的參數類型
一、 位置參數
也叫必傳參數,順序參數,是最重要的,也是必須在調用函數時明確提供的參數!位置參數必須按先后順序,一一對應,個數不多不少的傳遞!
說明:a,b,c是函數add的行參,沒有具體的值,只有在add(x,y,z)是才被傳入值,a=x=1,b=y=2,c=z=3, 其中x,y,z叫做實參,add(4,5,6,7),add(5,7)均為錯誤調用
二、關鍵字參數
在調用函數的時候,傳遞的參數是根據參數名傳值,不必按照定義形參的順序傳遞的參數叫做關鍵字參數
說明:在出傳遞參數時明確指定a=1,c=10,b=3,這樣傳遞這三個變量先后順序可以隨意調換,add(0, 3, c=10)中,既有位置參數又有關鍵字參數,位置參數必須放到關鍵字參數前面否則報錯
三、默認參數
在定義函數的時候,如果給某個參數提供一個默認值,這個參數就變成了默認參數,不再是位置參數了。在調用函數的時候,我們可以給默認參數傳遞一個自定義的值,也可以使用默認值。
說明:add( 0, 3 )沒有給c傳值,使用默認傳值3
-
默認參數必須在位置參數后面!
def add(c=2, a, b):此種定義函數的方法是錯誤的
- 默認參數盡量指向不變的對象!
說明:上面的答案可能與你想的不一樣,為什么呢?應為在定義默認函數時,a 為一個可變變量,在函數體被讀入內存的時候,默認參數a指向的空列表對象就會被創建,a的內存地址不變,每次調用函數都像a變量中添加A
動態參數
定義: 顧名思義,就是參數的個數是可以變的,這樣在調用函數的時候可以傳入任意多個參數
動態參數的兩種方式:
1.*args:一個星號表示接收任意個參數。調用時,會將實際參數打包成一個元組傳入形式參數。如果傳遞的是列表,列表將被當做一個整體
2.**kwargs:兩個星表示接受鍵值對的動態參數,數量任意。調用的時候會將實際參數打包成字典
.*args和**kwargs是約定俗成的參數名稱,也可以隨便寫成其他任何符合命名規范的參數名稱
*args:舉例子**
def test(*books):
print(books)
for i in books:
print(i)
books = [ "西游記", "三國演義", "水滸傳" ]
test("西游記", "三國演義", "水滸傳" )
test(books)
輸出結果
('西游記', '三國演義', '水滸傳')
西游記
三國演義
水滸傳
(['西游記', '三國演義', '水滸傳'],)
['西游記', '三國演義', '水滸傳']
說明:上邊的例子中*books為定義的一個可變參數,調用函數的時候可以傳遞多個參數,print(books)可以查看數此參數為一個元組,books列表被當做一個整體傳入
問題:能不能讓列表它內部的('西游記', '三國演義', '水滸傳')分別當做參數傳遞進去
答案:當然可以,就是在傳遞列表參數的時候在前面添加一個星號
def test(*books):
print(books)
for i in books:
print(i)
books = [ "西游記", "三國演義", "水滸傳" ]
test(books)
結果:
(['西游記', '三國演義', '水滸傳'])
西游記
三國演義
水滸傳
** kwargs:舉例說明
def func(**kwargs):
print(type(kwargs))
for kwg in kwargs:
print(kwg, kwargs[kwg])
func(k1='v1', k2=[0, 1, 2])
輸出結果:
k1 v1
k2 [0, 1, 2]
思考一下代碼結果是什么:
def func(**kwargs):
print(type(kwargs))
for kwg in kwargs:
print(kwg, kwargs[kwg])
core = {
"語文": 81,
"數學": 92
}
func(core)
結果:
D:\project\test\venv\Scripts\python.exe D:/project/test/venv/monster.py
Traceback (most recent call last):
File "D:/project/test/venv/monster.py", line 87, in
func(core)
TypeError: func() takes 0 positional arguments but 1 was given
Process finished with exit code 1
分析:
由于**kwargs需要傳遞鍵值對的參數,雖然字典是鍵值對的值,但是單獨傳遞字典名的時候會將字典當做位置參數傳遞,那有什么辦法將字典以鍵值對的方式當做多個參數傳遞呢?
答案:在傳遞字典的前面添加兩個星號
func(**core)
正確結果:
語文 81
數學 92
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
