如何編寫自己的Python函數(shù)——Python函數(shù)構(gòu)建

本部分內(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è)吧~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容