第八章(一)
函數(shù)是帶名字的代碼塊,用于完成具體的工作。要執(zhí)行函數(shù)定義的特定任務(wù),可調(diào)用該函數(shù)。當你需要在程序中多次實現(xiàn)同一項任務(wù)時,就可以調(diào)用該函數(shù),而不必反復(fù)編寫重復(fù)的代碼。從而使得程序的編寫、閱讀、測試和修復(fù)都會更容易。
1、定義函數(shù)
def greet_user():
print("Hello!")
greet_user()
# 輸出:
Hello!
使用關(guān)鍵字def來定義一個函數(shù),需要指明函數(shù)的名稱,有時候需要在括號內(nèi)指出函數(shù)為完成其任務(wù)需要什么樣的信息。定義中以冒號結(jié)尾,其下的所有縮進行構(gòu)成了函數(shù)體。要使用函數(shù),就要調(diào)用它。要調(diào)用函數(shù),可以依次指定函數(shù)名以及用括號括起的必要信息。
(1)向函數(shù)傳遞信息
def greet_user(username):
print("Hello, " + username + "!")
greet_user('Lily')
# 輸出:
Hello, Lily!
可以根據(jù)需要調(diào)用函數(shù)任意次,調(diào)用時無論傳入什么樣的名字,都會生成相應(yīng)的輸出。
(2)實參和形參
在上述的greet_user()函數(shù)的定義中,變量username是一個形參——函數(shù)完成其工作所需的一項信息。在greet_user('Lily')函數(shù)調(diào)用中,'Lily'是一個實參。實參是調(diào)用函數(shù)時傳遞給函數(shù)的信息。在調(diào)用時,實參的值就被存儲在形參中。
2、傳遞實參
實參和形參可以有多個。向函數(shù)傳遞實參的方式很多,可使用位置實參,這要求實參的順序與形參的順序相同;也可以使用關(guān)鍵字實參,其中每個實參都由變量名和值組成;還可使用列表和字典。
(1)位置實參
調(diào)用函數(shù)時,Python必須將函數(shù)調(diào)用中的每個實參都關(guān)聯(lián)到函數(shù)定義中的一個形參。所以最簡單的關(guān)聯(lián)方式是基于實參的順序,這種關(guān)聯(lián)方式被稱為位置實參。
def describe_pet(animal_type, pet_name):
print("I have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('hamster', 'harry')
# 輸出:
I have a hamster.
My hamster's name is Harry.
這個函數(shù)的定義表明,它需要一種動物類型和一個名字。調(diào)用該函數(shù)時,需要按順序提供一種動物類型和一個名字。
調(diào)用函數(shù)多次:
describe_pet('hamster', 'harry')
describe_pet('dog', 'willie')
# 輸出:
I have a hamster.
My hamster's name is Harry.
I have a dog.
My dog's name is Willie.
調(diào)用函數(shù)多次是一種效率極高的工作方式。在函數(shù)中,可根據(jù)需要使用任意數(shù)量的位置形參,Python將按順序?qū)⒑瘮?shù)調(diào)用中的實參關(guān)聯(lián)到函數(shù)定義中相應(yīng)的形參。
位置實參的位置很重要:
使用位置實參來調(diào)用函數(shù)時,實參的順序一定要和形參的位置一致,否則會導(dǎo)致結(jié)果出乎意料。
(2)關(guān)鍵字實參
關(guān)鍵字實參是傳遞給函數(shù)的名稱-值對。可以直接將實參中的名稱和值關(guān)聯(lián)起來,而無需考慮函數(shù)調(diào)用中的實參順序,還清楚地指出了函數(shù)調(diào)用中各個值的用途。
def describe_pet(animal_type, pet_name):
print("I have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(pet_name='harry', animal_type='hamster')
# 輸出:
I have a hamster.
My hamster's name is Harry.
在調(diào)用函數(shù)時,我們向Python明確指出了各個實參對應(yīng)的形參。關(guān)鍵字實參的順序無關(guān)緊要,輸出的結(jié)果也在預(yù)料之中。但是需要注意的是,使用關(guān)鍵字實參時,務(wù)必準確地指定函數(shù)定義中的形參名。
(3)默認值
編寫函數(shù)時,可給每個形參指定默認值。在調(diào)用函數(shù)中給形參提供了實參時,Python將使用指定的實參值;否則,將使用形參的默認值hi。因此,給形參指定默認值后,可在函數(shù)調(diào)用中省略相應(yīng)的實參。使用默認值可簡化函數(shù)調(diào)用,還可以清晰地指出函數(shù)的典型用法。
def describe_pet(pet_name, animal_type='dog'):
print("I have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(pet_name='willie')
# 輸出:
I have a dog.
My dog's name is Willie.
這里在函數(shù)的定義中給動物類型指定了默認值小狗。若在調(diào)用時沒有指定動物類型這個值,就默認為小狗。
另外,當函數(shù)定義中需要給某個實參給定默認值,該實參必須放在所有實參的后面。因為位置實參依然會按照順序傳遞實參。
注意:在使用默認值時,在形參列表中必須先列出沒有默認值的形參,再列出有默認值的形參。這讓Python依然能夠正確地解讀位置實參。
(4)等效的函數(shù)調(diào)用
鑒于可混合使用位置實參、關(guān)鍵字實參和默認值,通常有多種等效的函數(shù)調(diào)用方式。
describe_pet('willie')
describe_pet(pet_name='willie')
describe_pet('harry', 'hamster')
describe_pet(pet_name='harry', animal_type='hamster')
describe_pet(animal_type='hamster', pet_name='harry')
這些函數(shù)調(diào)用的輸出與前面的例子相同。
(5)避免實參錯誤
當你提供的實參多于或少于函數(shù)完成其工作所需的信息時,將出現(xiàn)實參不匹配錯誤。