本部分內(nèi)容基于《Python編程 從入門到實(shí)踐》
函數(shù)是帶名字的代碼塊,用于完成具體的任務(wù)。那么為什么我們需要編寫函數(shù)?編寫函數(shù)能夠幫助我們完成大量重復(fù)的工作而無(wú)需每次編寫相同的代碼。此外,項(xiàng)目中函數(shù)的引入也能夠讓我們的代碼具有更高的可讀性、可修復(fù)性。
Python函數(shù)定義基本格式
下面以編程中最常見(jiàn)的Hello World!為例展示Python函數(shù)定義的基本格式:
def greet_world(): #(1)
"""print Hello World!""" #(2)
print ("Hello World!") #(3)
greet_world()
上面就是Python函數(shù)定義的基本格式,具體來(lái)看:
(1) 處通過(guò) def 關(guān)鍵字告訴Python你要定義一個(gè)函數(shù),同時(shí)定義了這個(gè)函數(shù)的名字為 greet_world,圓括號(hào)還能讓我們放置一些函數(shù)完成任務(wù)所需要的參數(shù),這個(gè)部分是 缺一不可 的。
(2) 處的文本稱為 文檔字符串 ,主要是描述本函數(shù)的作用,其格式為 三引號(hào)括起。
(3) 處就是函數(shù)中的代碼。
所以綜上所述,這個(gè)函數(shù)的功能就是打印出 Hello World!,而不需要任何參數(shù)傳遞給這個(gè)函數(shù)。
Python函數(shù)形參和實(shí)參
有時(shí)候我們需要向函數(shù)傳遞一些參數(shù)讓函數(shù)能夠做一些“個(gè)性化”的工作。例如,我們需要針對(duì)不同的人打印出不同的歡迎標(biāo)語(yǔ),例如 Hello, Mike!。
這個(gè)時(shí)候我們?cè)撛趺崔k呢?首先看如何編寫函數(shù):
def greet_user(username):
"""welcome a person"""
print(f"Hello, {username}!")
greet_user("Mike")
使用這個(gè)函數(shù)我們就能每次給它一個(gè)名字,然后它打印出我們想要的歡迎信息了。參數(shù)的功能正是如此。那么什么是 形參,什么是 實(shí)參 呢?
總結(jié)起來(lái)一句話,函數(shù)定義過(guò)程中的參數(shù)是形參,函數(shù)使用過(guò)程中的參數(shù)是實(shí)參。像上面的例子,函數(shù)定義中的 username 就是形參,函數(shù)使用中的 Mike 就是實(shí)參。
如何向Python函數(shù)傳遞實(shí)參
向Python函數(shù)傳遞實(shí)參的方法有兩種:
一種是基于參數(shù)位置的使用 位置實(shí)參;
一種是基于形參的使用 關(guān)鍵字實(shí)參。
下面以一個(gè)實(shí)際例子闡述這兩種不同的傳遞實(shí)參的方法:我們想編寫一個(gè)函數(shù),用于頒獎(jiǎng)典禮的人員介紹,最終效果是打印出哪位同學(xué)來(lái)自哪個(gè)學(xué)校。首先還是構(gòu)建函數(shù):
def intro_person(name, university):
"""introduce a person"""
print(f"Let's welcome {name}!")
print(f"He is from {university}.")
-
位置實(shí)參
如果我們想要使用位置實(shí)參,就需要我們?cè)谙蚝瘮?shù)傳遞實(shí)參的時(shí)候?qū)?yīng)上位置,也就是說(shuō)我們的第一個(gè)實(shí)參必須是人名,第二個(gè)實(shí)參必須是學(xué)校名:
intro_person("Bio_Infor", "Nanjing University")
最終輸出結(jié)果如下:
>>> Let's welcome Bio_Infor!
>>> He is from Nanjing University.
但是我們?nèi)绻麑?shí)參的位置傳反了:
intro_person("Nanjing University", "Bio_Infor")
出來(lái)的結(jié)果就不是我們想要的了:
>>> Let's welcome Nanjing University!
>>> He is from Bio_Infor.
-
關(guān)鍵字實(shí)參
位置實(shí)參一個(gè)知名的缺點(diǎn)就在于我們必須要每次記住函數(shù)的形參順序,但是參數(shù)一多這就顯得有點(diǎn)困難,這個(gè)時(shí)候我們就可以使用關(guān)鍵字實(shí)參。
intro_person(name = "Bio_Infor", university = "Nanjing University")
intro_person(university = "Nanjing University", name = "Bio_Infor")
由于我們使用了關(guān)鍵字實(shí)參,對(duì)應(yīng)了實(shí)參和形參,所以這個(gè)時(shí)候上面兩個(gè)不同的實(shí)參順序最后函數(shù)運(yùn)行出來(lái)的結(jié)果并沒(méi)有不同~。
Python函數(shù)形參默認(rèn)值
很多時(shí)候我們看到的函數(shù)并不需要我們提供所有的實(shí)參,它們會(huì)自動(dòng)填充一些我們沒(méi)有提供的實(shí)參,這就是默認(rèn)值,在調(diào)用函數(shù)中給形參提供了實(shí)參之后,Python將使用指定的參數(shù)值,否則就會(huì)使用相殘的默認(rèn)值。使用默認(rèn)值可以簡(jiǎn)化函數(shù)的使用。
例如上面的例子,我們不一定會(huì)收集到每個(gè)人具體的專業(yè)信息,沒(méi)有時(shí)我們只能以philosophy (理學(xué))來(lái)代替。
def intro_person(name, university, major = "philosophy"):
"""introduce a person"""
print(f"Let's welcome {name}, whose major is {major}")
print(f"He is from {university}.")
來(lái)給幾個(gè)實(shí)參試試吧~
intro_person(university = "Nanjing University", name = "Bio_Infor")
這里沒(méi)有給 major 參數(shù),就使用了默認(rèn)值,結(jié)果為:
>>> Let's welcome Bio_Infor, whose major is philosophy
>>> He is from Nanjing University.
當(dāng)我們給了 major 對(duì)應(yīng)的實(shí)參:
intro_person(university = "Nanjing University", name = "Bio_Infor", major = "Life Sciences")
結(jié)果就變了:
>>> Let's welcome Bio_Infor, whose major is Life Sciences
>>> He is from Nanjing University.
需要注意的是,使用默認(rèn)值的形參必須放在函數(shù)定義的形參中最后的位置,否則將會(huì)報(bào)錯(cuò)。
Python函數(shù)實(shí)參變得可選
有的時(shí)候我們我們不一定有函數(shù)所需要的實(shí)參,這個(gè)時(shí)候該怎么辦?還是以上面的專業(yè)信息為例:
def intro_person(name, university, major = ""):
"""introduce a person"""
if major:
print(f"Let's welcome {name}, whose major is {major}.")
print(f"He is from {university}.")
else:
print(f"Let's welcome {name}!")
print(f"He is from {university}.")
在Python中,非空的字符串會(huì)被解讀為 True,所以如果我們給函數(shù)提供了 major 信息,if major 將為 True。
所以這個(gè)函數(shù)的運(yùn)行結(jié)果是這樣的:
intro_person(university = "Nanjing University", name = "Bio_Infor")
intro_person(university = "Nanjing University", name = "Bio_Infor", major = "Life Sciences")
>>> Let's welcome Bio_Infor!
>>> He is from Nanjing University.
>>> Let's welcome Bio_Infor, whose major is Life Sciences.
>>> He is from Nanjing University.
Python函數(shù)傳遞任意數(shù)量的實(shí)參
有的時(shí)候我們無(wú)法提前預(yù)知我們到底有多少實(shí)參,比如說(shuō)我們需要對(duì)每位嘉賓最后一次性在大屏上打印歡迎信息,這個(gè)時(shí)候……我們可能無(wú)法提前知道會(huì)來(lái)哪些人,會(huì)來(lái)多少人。這就是我們?nèi)绾蜗?Python函數(shù)傳遞任意數(shù)量的實(shí)參 的問(wèn)題。先看函數(shù):
def greet_persons(*args):
"""welcome persons"""
for arg in args:
print(f"Welcome, {arg}!")
具體來(lái)看:函數(shù)形參中的 * 能夠讓Python創(chuàng)建一個(gè)名為 args 的空元組,并將所有收到的值都封裝到這個(gè)元組當(dāng)中。我們可以把這個(gè)元組打印出來(lái),看看是不是這樣:
def greet_persons(*args):
"""welcome persons"""
print(args)
# for arg in args:
# print(f"Welcome, {arg}!")
greet_persons("Mike")
greet_persons("Mike", "Jason", "John")
我們可以看到,即使我們只傳遞了一個(gè)參數(shù),也會(huì)構(gòu)建出一個(gè)元組:
>>> ('Mike',)
>>> ('Mike', 'Jason', 'John')
然后我們通過(guò)遍歷并打印這個(gè)元組中的元素就能夠?qū)崿F(xiàn)我們的目的:
def greet_persons(*args):
"""welcome persons"""
for arg in args:
print(f"Welcome, {arg}!")
greet_persons("Mike")
greet_persons("Mike", "Jason", "John")
結(jié)果:
>>> Welcome, Mike!
>>> Welcome, Mike!
>>> Welcome, Jason!
>>> Welcome, John!
最后祝大家新年快樂(lè)吧~
