Python函數初探

2020-10-19 12:00:25

1.函數定義

Python使用關鍵字def來定義函數,語法為:

def function_name(param1,param2):
	"""檔案字串"""
	函數體

栗子:

def greet_user():
    """顯示簡單的問候語""" 
    print("Hello!")

檔案字串用於描述函數做了什麼。

1.1 向函數傳遞引數

現對函數做簡單的修改,讓函數不只會顯示hello。

def greet_user(username):
    """顯示簡單的問候語""" 
    print("Hello!" + username + ".")

呼叫函數:

greet_user("Jack")

輸出:

Hello!Jack

1.1.1 實參和形參

在函數greet_user()的定義中,變數username是一個形參–函數完成其工作所需要的一項資訊。
在程式碼greet_user(‘Jack’)中,'Jack’是一個實參。實參是呼叫函數時傳遞給函數的資訊。當呼叫函數時,將要讓函數使用的資訊放在括號內。
在greet_user(‘Jack’)中,將實參’Jack’傳遞給函數greet_user(),這個值被儲存在形參username中。

1.2 傳遞實參

函數定義中可能包含多個形參,因此也可能包含多個實參。向函數傳遞實參的方式很多:
可以使用位置實參,這要求實參的順序與形參的順序相同。
可以是使用關鍵字實參,其中每個實參都由變數名和值組成。
還可以使用列表和字典。

1.2.1 位置實參

呼叫函數時,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.

1.2.2 關鍵字實參

關鍵之實參是傳遞給函數的名稱-值對。直接在實參中將名稱和值關聯起來,無需考慮傳遞的實參的順序。
就上面的例子使用關鍵字實參:

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 哈哈.

1.2.3 預設值

編寫函數時,可以給每個形參都設定預設值,在呼叫函數時,如果給函數中的形參指定了實參,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放在後面的原因。

1.2.4 避免實參錯誤

在使用函數後,如果提供的實參多出或者少於形參都會導致錯誤:

# 避免實參錯誤
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」。

1.3 返回值

函數並不是總是直接顯示輸出,相反,它可以處理一些資料,返回一個或者一組值。函數返回的值被稱為返回值。在函數中,可以使用return語句將值返回到呼叫函數的程式碼行。

1.3.1 返回簡單值