前後連續的電腦語句組合在一起並有名字可供調用稱之為函數,本章主要介紹如何在程式中定義和使用函數其中包括如何調用函數、使用參數、使用參數的*和**運算,返回數值。如果把電腦語句比為武術動作的話,那麼函數就可以比喻為功夫“套路”,本質上“降龍十八掌”就是包含了18個語句的函數,那麼“葵花寶典”呢? ...
概念
瓊恩·雪諾當上守夜人的司令後,為訓練士兵對付僵屍兵團,把成功斬殺僵屍的一系列動作編排成了“葵花寶典劍法”,這就是函數。相似,在電腦世界,一系列前後連續的電腦語句組合在一起稱之為函數,本章主要介紹如何在程式中定義和使用函數。
1、函數的定義
有了函數後,當要用到相同功能時,我們就可以重覆地調用它而不用重寫代碼。下麵是瓊恩·雪諾用來上報戰況的程式,每殺死1鬼,通信員可以敲kill_dead(),而不用反覆敲print()語句了。
如下定義了 kill_dead函數,用來上報戰況
def kill_dead():
print('殺死異鬼1頭')
上面def語句定義了函數kill_dead,函數名可以由寫程式的人命名,必須以字母開頭,緊跟圓括弧,函數內的語句都必須多縮進4個空格。
2、函數的參數
例如print()是系統內置的函數,要顯示文字時我們把文字放進括弧里,這就是函數的參數。定義函數時我們也可以接受參數。
在調用時分為位置參數與關鍵字參數。
2.1 參數調用方式
我們來完善這個“戰況通報程式”,把英雄的名字和戰鬥業績也加上。
如下定義了 kill_dead函數,用來上報戰況
- name: 表示人名變數,
- number:表示戰績變數
def kill_dead(name,number):
print(name,'殺死異鬼',number,'頭') #逗號分隔參數顯示
這是主程式(沒有縮進)
kill_dead('Snow',2) #位置參數調用
kill_dead(name='Sam',number = 1) #關鍵字參數調用
kill_dead('Guido',number = 1) #位置+關鍵字參數調用
運行上面的程式會顯示出如下的結果:
Snow 殺死異鬼 2 頭
Sam 殺死異鬼 1 頭
Guido 殺死異鬼 1 頭
第1行語句是位置調用,第2行語句是關鍵字調用方式,第3行是混合方式。
2.2 參數的預設值
上述播報戰況的程式中,我們認為number(數量)每回填上比較麻煩,因為90%的的情況都是1,除了Snow偶爾會殺死2個。這我們就可以使用預設值,而不是每次都填。預設值可以使用等號寫在參數變數後面,如下:
如下定義了 kill_dead函數,用來上報戰況
- name: 表示人名變數,
- number:表示戰績變數
def kill_dead(name,number=1):
print(name,'殺死異鬼',number,'頭') #顯示
- 預設值數量為1,可以不填數量
kill_dead('小牛叔')
小牛叔殺死了1位,運行結果呢?
小牛叔 殺死異鬼 1 頭
說明: 有預設值的參數變數,叫可選參數;沒有預設值的參數,叫必選參數,可選參數定義時必須放在右側。
2.3 參數的*運算和**運算
特殊情況出現了,假設兵甲、兵乙...兵N同時殺死了1個敵人,這時的參數數量不固定怎麼辦?可以使用*運算,把所有的位置參數“壓縮”成一個元組變數;此外,還可以使用**運算,把所有的關鍵字參數“壓縮”成一個字典。用法如下:
- *names: 基於位置參數元組,表示的人名變數,
- **killed:基於關鍵字參數的字典,表示目標和數量
def group_kill(*names,**killed):
print(names,'殺死',killed['target'],killed['number'],'頭') #顯示
張王被壓縮成元組存在names,後面被組裝進字典killed里。
group_kill('張','王',number=2,target='異龍')
運行結果:
('張', '王') 殺死 異龍 2 頭
3、函數的返回值
類似於input()輸入函數可以返回用戶輸入的字元串結果,我們定義的函數也有返回值,返回值使用return語句。
假設有賞金獵人會根據殺敵多少從守夜人那裡領取每個人頭50金幣每個龍500金幣,計算2人3龍的賞金的程式這麼寫:
def money(dead:int,drag:int)->int:
return (dead*50 + drag*500)
運行如下:
print('2人3龍的賞金為:',money(2,3))
在本程式里,我們在參數後使用了:int,函數後使用了->int,其實這表示參數是整數,返回值是整數,加了會使程式更加好理解,不強制要求添加。
運行後的結果如下:
2人3龍的賞金為: 1600