3. 函數(shù)
函數(shù)是帶名字的代碼塊,用于完成具體的工作。需要在程序中多次執(zhí)行同一項(xiàng)任務(wù)時(shí),你無需反復(fù)編寫完成該任務(wù)的代碼,而只需調(diào)用執(zhí)行該任務(wù)的函數(shù),讓Python運(yùn)行其中的代碼。通過使用函數(shù),程序的編寫、閱讀、測試和修復(fù)都將更容易。
3.1 定義函數(shù)
定義一個(gè)打印問候語的簡單函數(shù),名為greet_user() 。
def greet_user():
? ? """顯示簡單的問候語"""
? ? print("Hello!")
greet_user()
詳解:
? 這個(gè)示例演示了最簡單的函數(shù)結(jié)構(gòu)
? 關(guān)鍵字def 來告訴Python你要定義一個(gè)函數(shù),指出函數(shù)名,還可能在括號內(nèi)指出函數(shù)為完成其任務(wù)需要什么樣的信息,即參數(shù)。在這里,函數(shù)名為greet_user() ,它不需要任何信息就能完成其工作,因此括號是空的(即便如此,括號也必不可少)。最后,定義以冒號結(jié)尾。
? 緊跟在def greet_user(): 后面的所有縮進(jìn)行構(gòu)成了函數(shù)體。
? 文檔字符串用三引號內(nèi)是文檔字符串 (docstring)的注釋,描述了函數(shù)是做什么的。Python使用它們來生成有關(guān)程序中函數(shù)的文檔。
? 代碼行print("Hello!") 是函數(shù)體,greet_user() 只做一項(xiàng)工作:打印Hello!
? 指定函數(shù)名以及用括號括起的必要信息調(diào)用此函數(shù),由于這個(gè)函數(shù)不需要任何信息,因此調(diào)用它時(shí)只需輸入greet_user() 即可。
3.1.1 向函數(shù)傳遞信息
實(shí)例說明:傳入被問候人名字,打印問候語。
def greet_user(username):
? ? """顯示簡單的問候語"""
? ? print("Hello, " + username.title() + "!")
greet_user('jesse')
3.1.2 實(shí)參和形參
在上例函數(shù)greet_user() 的定義中的變量username 是一個(gè)形參。在調(diào)用函數(shù)greet_user('jesse') 時(shí)傳遞的值'jesse' 是一個(gè)實(shí)參 。實(shí)參是調(diào)用函數(shù)時(shí)實(shí)際傳遞給函數(shù)的信息。
3.2 傳遞實(shí)參
函數(shù)定義中可能包含多個(gè)形參,因此函數(shù)調(diào)用中也可能包含多個(gè)實(shí)參。
向函數(shù)傳遞實(shí)參的方式很多,包括:
? 可使用位置實(shí)參:要求實(shí)參的順序與形參的順序相同;
? 關(guān)鍵字實(shí)參:其中每個(gè)實(shí)參都由變量名和值組成;
? 還可使用列表和字典。
3.2.1 位置實(shí)參
調(diào)用函數(shù)時(shí),Python必須將函數(shù)調(diào)用中的每個(gè)實(shí)參都關(guān)聯(lián)到函數(shù)定義中的一個(gè)形參。嚴(yán)格基于實(shí)參的順序的參數(shù)關(guān)聯(lián)方式被稱為位置實(shí)參 。示例:一個(gè)顯示寵物信息的函數(shù)。
def describe_pet(animal_type, pet_name):
? ? """顯示寵物的信息"""
? ? print("\nI have a " + animal_type + ".")
? ? print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('hamster', 'harry')
示例說明:
? 函數(shù)的定義需要二個(gè)參數(shù)(形參):動物類型和一個(gè)名字;
? 調(diào)用該函數(shù)時(shí),按順序提供一種動物類型和一個(gè)名字(實(shí)參)。
3.2.2 關(guān)鍵字實(shí)參
關(guān)鍵字實(shí)參是傳遞給函數(shù)的名稱---值對。直接在實(shí)參中將參數(shù)名稱和傳遞的值關(guān)聯(lián)起來了,關(guān)鍵字實(shí)參讓
開發(fā)人員無需考慮函數(shù)調(diào)用中的實(shí)參順序,還清楚地指出了函數(shù)調(diào)用中各個(gè)值的用途。示例:
def describe_pet(animal_type, pet_name):
? ? """顯示寵物的信息"""
? ? print("\nI have a " + animal_type + ".")
? ? print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(pet_name='harry', animal_type='hamster') #等效上面一句
注意:關(guān)鍵字參數(shù)不區(qū)分順序,但區(qū)分大小寫。
3.2.3 默認(rèn)值
? 編寫函數(shù)時(shí),可給每個(gè)形參指定默認(rèn)值 。在調(diào)用函數(shù)中給形參提供了實(shí)參時(shí),Python將使用指定的實(shí)參值;否則,將使用形參的默認(rèn)值。因此,給形參指定默認(rèn)值后,可在函數(shù)調(diào)用中省略相應(yīng)的實(shí)參。使用默認(rèn)值可簡化函數(shù)調(diào)用,還可清楚地指出函數(shù)的典型用法。
? 示例:如果你發(fā)現(xiàn)調(diào)用describe_pet() 時(shí),描述的多的是小狗,就可將形參animal_type 的默認(rèn)值設(shè)置為'dog' 。這樣,調(diào)用describe_pet() 來描述小狗時(shí),就可不提供這種信息。
def describe_pet(pet_name, animal_type='dog'):
? ? """顯示寵物的信息"""
? ? print("\nI have a " + animal_type + ".")
? ? print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(pet_name='willie') #省略了對animal_type參數(shù)傳遞實(shí)參,默認(rèn)使用dog
describe_pet('willie') #輸出結(jié)果和上面一句相同
注意:使用參數(shù)默認(rèn)值時(shí),參數(shù)按照位置參數(shù)來解析。即上例中若函數(shù)定義為
def describe_pet(animal_type='dog',pet_name),
則describe_pet(pet_name='willie')或describe_pet('willie')調(diào)用都會報(bào)錯(cuò),位置參數(shù)第二個(gè)參數(shù)未給定。
3.2.4 等效的函數(shù)調(diào)用
實(shí)例:若函數(shù)定義為def describe_pet(pet_name, animal_type='dog'): 則以下調(diào)用都是有效的
# 一條名為Willie的小狗
describe_pet('willie')
describe_pet(pet_name='willie')
# 一只名為Harry的倉鼠
describe_pet('harry', 'hamster')
describe_pet(pet_name='harry', animal_type='hamster')
describe_pet(animal_type='hamster', pet_name='harry')