接上一講名秀,這節(jié)我們專門介紹python函數(shù)的參數(shù)處理
本節(jié)主要內(nèi)容
- 函數(shù)的形式參數(shù)和實(shí)際參數(shù)
- 函數(shù)的參數(shù)定義規(guī)則
- 函數(shù)參數(shù)的默認(rèn)值
- 函數(shù)的可變參數(shù)
- 函數(shù)的關(guān)鍵字參數(shù)
- 函數(shù)的命名關(guān)鍵字參數(shù)
1.3. 函數(shù)的參數(shù)
1.3.1 函數(shù)的形式參數(shù)和實(shí)際參數(shù)
函數(shù)的參數(shù)主要會(huì)涉及到兩個(gè)概念:形式參數(shù)、實(shí)際參數(shù)
- 形式參數(shù):其實(shí)就是定義函數(shù)時(shí)肚菠,函數(shù)括號(hào)中的變量揩环,形式參數(shù)的意義是當(dāng)前函數(shù)如果要被調(diào)用執(zhí)行诉探,就必須讓函數(shù)接收括號(hào)中定好的參數(shù)才能正常執(zhí)行先较,就是形式上需要這些數(shù)據(jù)才能執(zhí)行函數(shù),所以稱為形式參數(shù)
-
實(shí)際參數(shù):實(shí)際參數(shù)是我們?cè)谕ㄟ^函數(shù)名稱調(diào)用函數(shù)時(shí)卵皂,在括號(hào)中傳遞的真實(shí)數(shù)據(jù)秩铆;實(shí)際傳遞給函數(shù)用于執(zhí)行的數(shù)據(jù),稱為實(shí)際參數(shù)
形式參數(shù)和實(shí)際參數(shù)的具體關(guān)系如下圖所示:
1.3.2. 函數(shù)的參數(shù)定義規(guī)則
函數(shù)通過def進(jìn)行定義灯变,用于執(zhí)行一個(gè)功能殴玛,一個(gè)函數(shù),可以需要參數(shù)添祸,也可以不需要參數(shù)族阅。
類似我們現(xiàn)實(shí)生活,執(zhí)行一個(gè)功能就是做一件事情膝捞,做這件事情需要的資源就是參數(shù)坦刀,去做一件事情,有些需要資源蔬咬,有些是不需要資源的鲤遥。
所以!
規(guī)則1:如果我們的程序中出現(xiàn)了一部分功能代碼重復(fù)執(zhí)行林艘,就需要封裝一個(gè)函數(shù)來減少代碼的重復(fù)量
規(guī)則2:根據(jù)代碼執(zhí)行是否需要其他額外的數(shù)據(jù)盖奈,需要額外的幾個(gè)數(shù)據(jù)就定義幾個(gè)參數(shù),不需要額外的數(shù)據(jù)就不定義參數(shù)
規(guī)則3:實(shí)際參數(shù)可以傳遞任意對(duì)象(python中一切皆對(duì)象)
1.3.3. 函數(shù)參數(shù)默認(rèn)值
某些時(shí)候狐援,我們可以給函數(shù)的參數(shù)定義默認(rèn)值钢坦,這樣函數(shù)在調(diào)用過程中,如果某些參數(shù)沒有傳遞啥酱,就直接使用默認(rèn)值來執(zhí)行函數(shù)代碼了爹凹,函數(shù)默認(rèn)參數(shù)確定比較簡(jiǎn)單,直接在形式參數(shù)上賦值就可以
# 重新定義函數(shù)镶殷,給參數(shù)設(shè)置默認(rèn)值5
def getCircleArea(pi=3.1415, radius=5) :
a = pi * (radius ** 2);
return a;
# 調(diào)用函數(shù)計(jì)算圓面積禾酱,不傳遞參數(shù),使用默認(rèn)值
a1 = getCircleArea();
# 調(diào)用函數(shù),傳遞參數(shù)進(jìn)行計(jì)算
a2 = getCircleArea(3.14, 3);
# 調(diào)用函數(shù)颤陶,給第二個(gè)參數(shù)傳遞數(shù)據(jù)進(jìn)行計(jì)算
a3 = getCircleArea(radius=8);
1.3.4. 函數(shù)的可變參數(shù)
在某些情況下颗管, 函數(shù)的參數(shù)個(gè)數(shù)不是確定的,這樣在常規(guī)定義函數(shù)時(shí)就木有辦法進(jìn)行形式參數(shù)的定義了滓走。
python提供了一種可變參數(shù)垦江,可以完美的解決這個(gè)問題
可變參數(shù),是在形式參數(shù)前面加一個(gè)*符號(hào)作為標(biāo)識(shí)
# 定義一個(gè)函數(shù)搅方,用于打印多個(gè)數(shù)據(jù)
def printMsg(*msgs) :
for x in msgs:
print(x);
printMsg("tom");
printMsg("tom", "jerry");
printMsg("tom", "jerry", "shuke");
# 以上三個(gè)函數(shù)調(diào)用比吭,都是可以正常執(zhí)行的
注意,在某些特殊情況下腰懂,函數(shù)的可變參數(shù)放在了固定參數(shù)的前面梗逮;此時(shí)函數(shù)的調(diào)用就需要通過變量名稱指定數(shù)據(jù)了(這個(gè)也成為命名關(guān)鍵字參數(shù)项秉,后面的內(nèi)容中有單獨(dú)介紹)
# 可變參數(shù)msgs放在固定參數(shù)name的前面了
def printMsg(*msgs, name) :
print (name);
print(msgs);
for x in msgs:
print("-->" + x);
# 普通調(diào)用绣溜,出現(xiàn)錯(cuò)誤
# 函數(shù)中的參數(shù)都被可變參數(shù)接收了,name就木有可以接收的數(shù)據(jù)了
printMsg("tom", "jerry");
# 必須如下方式調(diào)用才可以;指定name參數(shù)傳遞數(shù)據(jù)
printMsg("tom", "jerry", name="shuke");
可變參數(shù)是將傳入函數(shù)的多個(gè)參數(shù)娄蔼,自動(dòng)封裝成了一個(gè)tuple字典怖喻,也就是一組數(shù)據(jù)來使用。
上面的可變參數(shù)*msgs
在函數(shù)中打印的結(jié)果如下:
print (msgs);
執(zhí)行結(jié)果:("tom", "jerry")
1.3.5. 特殊的用法:關(guān)鍵字參數(shù)
將傳遞給函數(shù)的參數(shù)岁诉,解析成dict字典的形式锚沸,也就是key:value鍵值對(duì)的形式,這就是關(guān)鍵字參數(shù)的意義涕癣,更加方便可變參數(shù)的操作
關(guān)鍵字參數(shù)哗蜈,使用兩個(gè)**符號(hào)來聲明關(guān)鍵字參數(shù)
def printMsg(**msgs) :
print(msgs);
printMsg(name="jerry", age=18);
函數(shù)中打印結(jié)果:{name:"jerry", age:18}
注意,關(guān)鍵字參數(shù)坠韩,還可以指定只能傳遞什么樣的名稱為參數(shù)名稱距潘,就是命名關(guān)鍵字參數(shù)。命名關(guān)鍵字參數(shù)通過*符號(hào)作為分隔符號(hào)只搁,符號(hào)后面的參數(shù)就是命名關(guān)鍵字參數(shù)
# 定義具有命名關(guān)鍵字的參數(shù)
def printMsg(name, age, *, province, city):
print(name, age, province, city);
# 調(diào)用時(shí)需要傳遞具體的參數(shù)
printMsg("tom", 18, province="HN", city="ZZ");
另外一種情況音比,就是在可變參數(shù)的后面,添加的參數(shù)都是命名關(guān)鍵字參數(shù)氢惋,這里的命名關(guān)鍵字參數(shù)就不需要*符號(hào)分隔了
# 下面的函數(shù)洞翩,province和city兩個(gè)參數(shù)是放在可變參數(shù)*args后面的
# 就是制定的命名關(guān)鍵字參數(shù),在前面可變參數(shù)部分有提到
def printMsg(name, age, *args, province, city):
函數(shù)中的執(zhí)行代碼
# 此時(shí)函數(shù)的調(diào)用如下
printMsg("tom", 19, "tom is a cat", province="HZ", city="ZZ");
擴(kuò)展:函數(shù)中的參數(shù)焰望,根據(jù)傳遞的參數(shù)的順序骚亿、參數(shù)類型的不同,會(huì)有各種不同的組合方式熊赖,如傳遞[字符串循未、字符串]、[字符串、字符串...]的妖、[字符串绣檬、數(shù)值..]、[數(shù)值嫂粟、函數(shù)...]等等各種各樣的情況娇未,但是我們有了可變參數(shù)
*args
和命名關(guān)鍵字參數(shù)**kw
之流的出現(xiàn),讓函數(shù)參數(shù)的接收變得比較簡(jiǎn)單星虹。
我們可以通過(*args, **kw)的形式來接收任何形式的參數(shù)
本節(jié)內(nèi)容主要介紹python中的函數(shù)參數(shù)問題零抬,下一節(jié)繼續(xù)介紹函數(shù)的返回值處理