定義函式
舉個簡單的例子
def greet_user(username):
"""先是簡單的問候語"""
print("Hello! " + username.title() + "!")
greet_user("mike")
執行結果:
Hello! Mike!複製程式碼
由上所示,關鍵字def
定義一個函式,後面跟著函式名以及用來輸入引數的括號,定義以冒號結束,而print("Hello!")
為其函式體。
呼叫函式時,則依次指定函式名以及用括號括起的必要資訊,如引數等。
實參和形參
在函式greet_user(username)
的定義中,變數username是一個形參。形參是一個函式完成其工作所需的一個引數。
在程式碼greet_user("mike")
中,值"mike"
是一個實參。實參是呼叫函式時傳遞給函式的引數。
呼叫greet_user("mike")
函式時,我們將實參"mike"
傳遞給了函式greet_user()
,這個值被儲存在形參username。
傳遞實參
位置實參:呼叫函式時,必須將函式呼叫中的每個實參都採用基於實參順序的方式關聯到函式定義中的一個形參中。
關鍵字實參:呼叫函式時,直接傳遞給函式名稱-值對。此時不用考慮實參順序。
def printID(ID, sname):
print(ID + ":" + sname)
printID('14', 'mike') #位置實參
printID(sname='lili', ID='15') #關鍵字實參
執行結果:
14:mike
15:lili複製程式碼
預設值:給形參指定預設值。在呼叫函式中給形參提供了實參時,則用指定的實參值。如果沒有提供則使用形參預設值。
PS:使用預設值時,在形參列表中必須Ian列出沒有預設值的形參,再列出有預設值的實參。才能讓python正確解讀位置實參。
def printID(ID, sname = 'mike'):
print(ID + ":" + sname)
printID('14') #<-here
printID(sname='lili', ID='15')
執行結果:
14:mike
15:lili複製程式碼
返回值
返回簡單值
def get_formatted_name(first_name, last_name):
full_name = first_name + ' ' + last_name
return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
print(musician)
執行結果:
Jimi Hendrix複製程式碼
我們可以使用return
語句在函式中返回值。
讓實參可選
def get_formatted_name(first_name, last_name, middle_name=''):
if middle_name:
full_name = first_name + ' ' + middle_name + ' ' + last_name
else:
full_name = first_name + ' ' + last_name
return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
print(musician)
musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)
執行結果:
Jimi Hendrix
John Lee Hooker複製程式碼
如上所示,使用if條件語句,並將實參作為判斷條件即可讓實參可選。
傳遞列表
將列表傳遞給函式後,不僅可以遍歷列表,還能修改列表,並且這種修改時永久性的。
如果要禁止函式修改列表,可以傳遞列表的副本,比如:function_name(list_name[:])
。
傳遞任意數量的實參
def make_pizza(*toppings):
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
執行結果:
('pepperoni',)
('mushrooms', 'green peppers', 'extra cheese')複製程式碼
形參名*toppings
中的星號表示建立一個名為 toppings 的空元組,並把所有收到的值封裝在這個元組中。我們還可以使用迴圈語句將所有值列印出來。
結合使用位置實參和任意數量實參
如果要讓函式接受不同型別的實參,必須在函式定義中將接納任意數量的實參的形參放在最後。這樣,python會先匹配位置實參和關鍵字實參,並把餘下的實參都收集到最後一個形參中。
def make_pizza(size, *toppings):
print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
執行結果:
Making a 16-inch pizza with the following toppings:
- pepperoni
Making a 12-inch pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese複製程式碼
使用任意數量的關鍵字實參
def build_profile(first, last, **user_info):
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key, value in user_info.items():
profile[key] = value
return profile
user_profile = build_profile('albert', 'einstein',location='princeton',field='physics')
print(user_profile)複製程式碼
形參**user_info
中的兩個星號表示建立一個名為user_info的空字典,並將收到的所有名稱-值對都封裝到這個字典中。
將函式儲存在模組中
匯入整個模組
模組時副檔名為.py的檔案,包含要匯入到程式中的程式碼。使用import
語句可以將模組匯入。
#pizza.py
def make_pizza(size, *toppings):
print("\nMaking a " + str(size) +"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
#making_pizzas.py
import pizza
pizza.make_pizza(16, 'pepperoni')
pizza.make_pizza(12,'mushrooms', 'green peppers', 'extra cheese')
執行結果:
Making a 16-inch pizza with the following toppings:
- pepperoni
Making a 12-inch pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese複製程式碼
如果匯入的是整個模組,呼叫的時候就要指定模組名:module_name.function_name()
。
匯入特定的函式
匯入模組中特定的函式,可以使用以下方法:from module_name import function_name
用逗號分隔函式名,可匯入任意數量函式:from module_name import function_0, function_1, function_2
這時候呼叫函式,無需使用句點,直接指定函式名,因為我們在import
語句中顯示匯入了函式。
使用as給函式指定別名
為了防止衝突,或者函式名太長,可指定一個獨一無二的別名,函式的另外一個名稱,通用語法為:from module_name import function_name as fn
匯入模組中的所有函式
使用星號(*
)運算子可以匯入模組中的所有函式,此時不用使用句點來呼叫函式。不過最好不要這樣。語法為:from module_name import *
。