Python使用關鍵字def來定義函數,語法為:
def function_name(param1,param2):
"""檔案字串"""
函數體
栗子:
def greet_user():
"""顯示簡單的問候語"""
print("Hello!")
檔案字串用於描述函數做了什麼。
現對函數做簡單的修改,讓函數不只會顯示hello。
def greet_user(username):
"""顯示簡單的問候語"""
print("Hello!" + username + ".")
呼叫函數:
greet_user("Jack")
輸出:
Hello!Jack
在函數greet_user()的定義中,變數username是一個形參–函數完成其工作所需要的一項資訊。
在程式碼greet_user(‘Jack’)中,'Jack’是一個實參。實參是呼叫函數時傳遞給函數的資訊。當呼叫函數時,將要讓函數使用的資訊放在括號內。
在greet_user(‘Jack’)中,將實參’Jack’傳遞給函數greet_user(),這個值被儲存在形參username中。
函數定義中可能包含多個形參,因此也可能包含多個實參。向函數傳遞實參的方式很多:
可以使用位置實參,這要求實參的順序與形參的順序相同。
可以是使用關鍵字實參,其中每個實參都由變數名和值組成。
還可以使用列表和字典。
呼叫函數時,Python必須將函數呼叫的每個實參都關聯到函數定義中的一個形參,這就要求實參的順序與形參的順序要一致。
下面來看一個顯示寵物資訊的函數。
def describe_pet(animal_type,pets_name):
"""顯示寵物資訊"""
print("I have a " + animal_type + "!")
print("its name was " + pets_name + ".")
呼叫函數:
describe_pet("dog","哈哈")
輸出:
I have a dog!
its name was 哈哈.
位置實參的順序很重要,如果實參放錯了順序將會導致違揹我們預期的結果:
def describe_pet(animal_type,pets_name):
"""顯示寵物資訊"""
print("I have a " + animal_type + "!")
print("its name was " + pets_name + ".")
呼叫函數:
describe_pet("哈哈","dog")
輸出:
I have a 哈哈!
its name was dog.
關鍵之實參是傳遞給函數的名稱-值對。直接在實參中將名稱和值關聯起來,無需考慮傳遞的實參的順序。
就上面的例子使用關鍵字實參:
def describe_pet(animal_type,pets_name):
"""顯示寵物資訊"""
print("I have a " + animal_type + "!")
print("its name was " + pets_name + ".")
呼叫函數:
describe_pet(animal_type = "dog",pets_name = "哈哈")
輸出:
I have a dog!
its name was 哈哈.
編寫函數時,可以給每個形參都設定預設值,在呼叫函數時,如果給函數中的形參指定了實參,Python就會使用指定的實參,如果不指定的話就會使用預設的形參。
還是對寵物的例子,我們修改一下形參的順序,將animal_type放在第二個形參的位置:
def describe_pet(pets_name,animal_type=「dog」):
"""顯示寵物資訊"""
print("I have a " + animal_type + "!")
print("its name was " + pets_name + ".")
呼叫函數:
describe_pet(「哈哈」)
輸出:
I have a dog!
its name was 哈哈.
上面程式碼中已經給animal_type指定了預設值’dog’,所以在函數呼叫的時候,如果animal_type是’狗狗’的話,就不要指定實參了。在呼叫函數的時候,只指定了一個實參’哈哈’,但是這個實參還是位置實參,也就是關聯到pets_name,這也就是為什麼將預設值animal_type放在後面的原因。
在使用函數後,如果提供的實參多出或者少於形參都會導致錯誤:
# 避免實參錯誤
def describe_pet(animal_type, pet_name):
"""describe_pet imformation"""
print("I have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
呼叫函數:
describe_pet()
由於沒有給函數傳遞實際引數,所以程式報錯:
Traceback (most recent call last):
File "C:/Users/ASUS/PycharmProjects/Test_Program/Note.py", line 8, in <module>
describe_pet()
TypeError: describe_pet() missing 2 required positional arguments: 'animal_type' and 'pet_name'
報錯解讀:
TypeError: describe_pet() missing 2 required positional arguments: 'animal_type' and 'pet_name'
程式提示呼叫函數時缺少2個位置引數,分別是「animal_type」和「pet_name」。
函數並不是總是直接顯示輸出,相反,它可以處理一些資料,返回一個或者一組值。函數返回的值被稱為返回值。在函數中,可以使用return語句將值返回到呼叫函數的程式碼行。