我們首先定義一個簡單的函數,打印一條問候語句。
def greet_user():
"""顯示簡單的問候語"""
print('hello')
greet_user()
代碼使用def告訴Python需要定義一個函數,寫出函數名,定義以冒號結尾 ,如:def greet_user():
在定義後面,後面的所有的縮進都構成了函數體,在函數體內,我們將我們所需要函數的功能寫出。調用函數時,只需輸入函數即可。
hello
在函數定義def greet_user()括號內添加username,就可以讓函數接受你給username的任何值,調用函數時,將輸入信息傳遞給它。
def greet_user(username):
"""顯示簡單的問候語"""
print('hello ' + username.title())
greet_user('jake')
代碼greet_user('jake')調用函數greet_user(),並向它提供執行print語句所需的信息。
hello Jake
在函數greet_user()的定義中,變量username就是一個形參,在代碼greet_user('jake')中,Jake就是一個實參。實參是函數調用時傳遞給函數的信息。
調用函數時必須將函數調用中的每個實參都關聯到函數定義中的每一個形參,最簡單的關聯方式時基於實參的順序,這種關聯方式稱為位置實參。如下:
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')
調用函數describe_pet()時,我們按順序提供了兩個實參分別存儲在實參中,我們輸出兩個寵物的信息:
I have a hamster.
My hamster's name is Harry.
我們可以根據需要調用函數任意次,重新調用函數即可。如下:
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')
describe_pet('dog','willie')
同樣向函數提供實參,將實參關聯到形參,輸出結果:
I have a hamster.
My hamster's name is Harry.
I have a dog.
My dog's name is Willie.
調用函數多次是一種效率極高的工作方式,在函數中,可根據需要使用任意數量的位置實參,Python將按順序將函數中調用的實參關聯到函數定義中相應的形參。
位置實參的順序很重要。使用位置實參調用函數時,如果實參的順序不正確,結果也必然與預想的不符合。
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('willie','dog')
如上,我們將輸入寵物的名字與類型顛倒,實參傳遞到關聯的形參也是根據我們輸入形參的順序自動匹配的,它就會按照我們輸入的順序輸出。
I have a willie.
My willie's name is Dog.
在調用函數中,我們先指定的名字,再指定的類型,由於實參willie在前,這個值將存儲到形參animal_type中;同樣,實參dog將存儲到形參pet_name中,所得到的輸出與我們想要得到的恰好相反。
為了解決這一個問題,我們就可以使用關鍵字實參,直接再實參中將名稱和值關聯起來。
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='dog',pet_name=willie)
describe_pet(pet_name='willie',animal='dog')
關鍵字實參讓我們無需考慮函數調用中的實參順序,同時也指出了函數調用中各個值的用途。
I have a dog.
My dog's name is Willie.
I have a dog.
My dog's name is Willie.
使用關鍵字實參時,必須准確的指出函數定義中的形參名。
默認值:編寫函數時,可給每個形參指定值,在調用函數中給形參提供了實參時,Python將使用指定的實參值,否則,將使用形參的默認值。比如我們像形參animal_type提供默認值dog,在未指定animal_type的形參的,它將自動使用默認值。
def describe_pet(animal_type='dog', pet_name):
"""顯示寵物的信息"""
print("\nI 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.
當然,當我們調用函數,需要提供的實參與形參默認的實參值不同的時候,我們只需像前面一樣輸入,當調用的函數中給形參提供了實參時,將使用指定的實參值,而不再是默認值。
def describe_pet(animal_type='dog', pet_name):
"""顯示寵物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is" + pet_name.title() + '.')
describe_pet(animal_type='cat',pet_name=willie)
I have a cat.
My dog's name is Willie.
由於顯示的給animal_type提供了實參值,所以Python將忽略這個形參的默認值。
避免實參錯誤,使用函數後,如果遇到實參不匹配錯誤,那就是我們提供的實參多於或少於函數完成其工作所需要的信息,這時我們回去檢查我們對函數調用那塊,提供正確數量的實參即可。