前言
瓊恩·雪諾當(dāng)上守夜人的司令后浸踩,為訓(xùn)練士兵對(duì)付僵尸兵團(tuán)戰(zhàn)肺孵,把斬殺僵尸的系列動(dòng)作編排成了一套劍法惯豆。相似的在計(jì)算機(jī)世界,一系列前后連續(xù)的計(jì)算機(jī)語句組合在一起稱之為函數(shù)跪解,本章主要介紹如何在程序中定義和使用函數(shù)炉旷。
計(jì)算機(jī)語言中的任何概念都是為了更方便的寫代碼
1、函數(shù)的定義
有了函數(shù)后叉讥,當(dāng)要用到相同功能時(shí)窘行,我們就可以重復(fù)地調(diào)用它而不用重寫代碼。下面是瓊恩·雪諾用來上報(bào)戰(zhàn)況的程序图仓,每殺死1鬼罐盔,通信員可以敲kill_dead(),而不用反復(fù)敲print()語句了救崔。
#如下定義了 kill_dead函數(shù)惶看,用來上報(bào)戰(zhàn)況
def kill_dead():
print('殺死異鬼1頭')
上面的def語句定義了一個(gè)函數(shù)kill_dead,函數(shù)名可以由寫程序的人命名六孵,必須以字母開頭纬黎,后面跟著圓括號(hào),函數(shù)內(nèi)的語句都必須多縮進(jìn)4個(gè)空格劫窒。
2本今、函數(shù)的參數(shù)
例如print()是系統(tǒng)內(nèi)置的函數(shù),要顯示文字時(shí)我們把文字放進(jìn)括號(hào)里,這就是函數(shù)的參數(shù)诈泼。定義函數(shù)時(shí)我們也可以接受參數(shù)懂拾。
在調(diào)用時(shí)分為位置參數(shù)與關(guān)鍵字參數(shù)。
2.1 參數(shù)調(diào)用方式
我們來完善一下這個(gè)戰(zhàn)況通報(bào)程序铐达,把英雄的名字和戰(zhàn)斗業(yè)績(jī)也加上岖赋。
#如下定義了 kill_dead函數(shù),用來上報(bào)戰(zhàn)況
# name: 表示人名變量, number:表示戰(zhàn)績(jī)變量
def kill_dead(name,number):
print(name,'殺死異鬼',number,'頭') #逗號(hào)分隔參數(shù)顯示
#這是主程序(沒有縮進(jìn))
kill_dead('Snow',2) #位置參數(shù)調(diào)用
kill_dead(name='Sam',number = 1) #關(guān)鍵字參數(shù)調(diào)用
kill_dead('Guido',number = 1) #位置+關(guān)鍵字參數(shù)調(diào)用
運(yùn)行上面的程序會(huì)顯示出如下的結(jié)果:
Snow 殺死異鬼 2 頭
Sam 殺死異鬼 1 頭
Guido 殺死異鬼 1 頭
第1行語句是位置調(diào)用瓮孙,第2行語句是關(guān)鍵字調(diào)用方式唐断,第3行是混合方式。
2.2 參數(shù)的默認(rèn)值
上述播報(bào)戰(zhàn)況的程序中杭抠,我們認(rèn)為number(數(shù)量)每回填上比較麻煩脸甘,因?yàn)?0%的的情況都是1,除了Snow偶爾會(huì)殺死2個(gè)偏灿。這我們就可以使用默認(rèn)值丹诀,而不是每次都填。默認(rèn)值可以使用等號(hào)寫在參數(shù)變量后面翁垂,如下:
#如下定義了 kill_dead函數(shù)铆遭,用來上報(bào)戰(zhàn)況
# name: 表示人名變量, number:表示戰(zhàn)績(jī)變量
def kill_dead(name,number=1):
print(name,'殺死異鬼',number,'頭') #顯示
#默認(rèn)值不填
kill_dead('小牛叔')
小牛叔殺死了1位,運(yùn)行結(jié)果呢沿猜?
小牛叔 殺死異鬼 1 頭
說明: 有默認(rèn)值的參數(shù)變量枚荣,叫可選參數(shù);沒有默認(rèn)值的參數(shù)啼肩,叫必選參數(shù)橄妆,可選參數(shù)定義時(shí)必須放在右側(cè)。
2.3 參數(shù)的*運(yùn)算和**運(yùn)算
特殊情況出現(xiàn)了祈坠,假設(shè)兵甲害碾、兵乙...兵N同時(shí)殺死了1個(gè)敵人,這時(shí)的參數(shù)數(shù)量不固定怎么辦赦拘?可以使用*運(yùn)算蛮原,把所有的位置參數(shù)“壓縮”成一個(gè)元組變量;此外另绩,還可以使用**運(yùn)算儒陨,把所有的關(guān)鍵字參數(shù)“壓縮”成一個(gè)字典。用法如下:
# *names: 基于位置參數(shù)元組笋籽,表示的人名變量,
# **killed:基于關(guān)鍵字參數(shù)的字典蹦漠,表示目標(biāo)和數(shù)量
def group_kill(*names,**killed):
print(names,'殺死',killed['target'],killed['number'],'頭') #顯示
#張王被壓縮成元組存在names,后面被組裝進(jìn)字典killed里。
group_kill('張','王',number=2,target='異龍')
運(yùn)行結(jié)果:
('張', '王') 殺死 異龍 2 頭
3车海、函數(shù)的返回值
類似于input()輸入函數(shù)可以返回用戶輸入的字符串結(jié)果笛园,我們定義的函數(shù)也有返回值隘击,返回值使用return語句。
假設(shè)有賞金獵人會(huì)根據(jù)殺敵多少?gòu)氖匾谷四抢镱I(lǐng)取每個(gè)人頭50金幣每個(gè)龍500金幣研铆,計(jì)算2人3龍的賞金的程序這么寫:
def money(dead:int,drag:int)->int:
return (dead*50 + drag*500)
print('2人3龍的賞金為:',money(2,3))
在本程序里埋同,我們?cè)趨?shù)后使用了:int,函數(shù)后使用了->int棵红,其實(shí)這表示參數(shù)是整數(shù)凶赁,返回值是整數(shù),加了會(huì)使程序更加好理解逆甜,不強(qiáng)制要求添加虱肄。
運(yùn)行后的結(jié)果如下:
2人3龍的賞金為: 1600
*跟隨小牛叔的腳步,編程入門不掉隊(duì)!