Python基礎之白話說函式

runfox545發表於2019-01-07

轉自白月黑羽Python3教程之函式:http://www.python3.vip/doc/tutorial/python/0005/

什麼是函式

人類語言裡面,我們不僅會給人和物起名字, 比如 小張, 足球, iphone

有時候,我們還要給 一件事情,一串動作起名字,指代 某個流程。

比如:我們公司的面試流程是

把求職者帶到3號會議室
請求職者 完成答卷
讓測試經理來面試 求職者
讓技術總監面試 求職者

我們會把上面這 一連串的事情,起名叫 面試流程。

面試流程就代表了這一串動作。

以後,我們想告訴 HR 給誰面試的時候,只要說,走面試流程 ,就行了。

不需要說, HR ,請你做如下的事情

把求職者帶到3號會議室
請求職者 完成答卷
讓測試經理來面試 求職者
讓技術總監面試 求職者

  

你們會這麼說嗎?

不會,因為這樣太麻煩了。我給它起名字面試流程,只要走 面試流程,HR 自然知道是什麼意思。這樣就方便多了。

函式定義


同樣的道理,在程式設計上,如果我要多次輸出面試的流程,就像下面的程式碼,

print("把求職者帶到3號會議室")
print("請求職者 完成答卷")
print("讓測試經理來面試 求職者")
print("讓技術總監面試 求職者")

  

每次都全部寫一遍太煩了, 就可以定義一個名字來代表要執行這四條語句

定義一個名字 對應多個語句操作, 稱之為定義函式

所以:定義函式 就好像是給 一段程式碼 起了個名字

Python中,我們是這樣定義函式的:

def interview():
 print("把求職者帶到3號會議室")
 print("請求職者 完成答卷")
 print("讓測試經理來面試 求職者")
 print("讓技術總監面試 求職者")

  

def 是關鍵字 表示定義一個函式,後面是函式的名字,緊接著後面需要一個括號 ,這個括號中間,根據需要還可以有n個引數,這裡我們先不講它。最後是一個冒號,下面的縮排的程式碼表示這個函式名字代表的具體動作是什麼,稱之為函式體。

函式體的程式碼是需要縮排的。我們建議縮排四個空格。

函式呼叫

這樣定義好了以後,後面的程式碼要指代這個面試的流程,只需要寫名字 interview 就行了。 比如:

print(interview)

執行一下,發現會輸出內容如下

<function interview at 0x05292468>

表示這個 interview 是 一個函式型別的物件。

特別要注意的是,直譯器執行程式碼的時候,執行到定義函式的程式碼,並不會執行函式體裡面的程式碼。 要執行函式體裡面的程式碼,必須呼叫函式。

Python中呼叫函式的語句,就是在 函式名後面加上括號。比如,要執行 interview 這個名字代表的動作,就在後面加上括號 interview()

如下:

interview()
print('後續程式碼')

interview() 就叫 呼叫函式 interview ,有時也叫做 執行函式 interview。

要注意的是,當直譯器執行完被呼叫函式內部的程式碼後,還會返回到呼叫它的程式碼處,繼續執行後面的程式碼。上面的例子裡面,就是在 執行完 interview 對應的函式內部程式碼後, 會返回撥用處,進行執行後面的 這條語句

print('後續程式碼')

大家仔細看看我們的程式碼, 裡面除了有 interview 這個函式,還有什麼函式? 對了print

其實,我們這裡 print 這個名字 也是一個函式的名字, 表示一個動作就是把裡面的物件 顯示到螢幕上,這個動作實現的具體程式碼在哪裡?

python語言的開發者 知道 這是我們常用的操作, 所以在python直譯器內部已經幫我們實現好了 這樣一個函式, 稱之為內建函式。

關注我,私信我【Python】,還可以免費獲取一套精心整理的電子書籍喲!

可以點選文章末尾【瞭解更多】,或者百度搜尋【白月黑羽】,通過線上教程一起來學Python

函式引數

這個print函式呼叫的時候,有個和我們上面定義的 interview 有明顯的不同,大家有沒有發現?看看

interview()

print("把求職者帶到3號會議室")

區別在哪裡? 對了,括號裡面有內容。函式呼叫括號裡面的內容 稱之為函式的 引數。有的函式要完成功能,需要告訴它一些資訊。比如print函式,如果你不告訴它要列印的內容是什麼,它怎麼能列印資訊到螢幕上呢?

引數的作用 就是: 提供 函式完成功能 所必須的資訊

有引數的函式像這樣

def func(para1,para2):
 ...

函式的引數都是放在函式定義的括號裡面的。比如上面示例程式碼中的 para1,para2

引數其實也是一個變數,所以他們的命名規則和變數的命名規則一樣。引數可以沒有,可以是一個,也可以是多個。引數之間用逗號隔開。

呼叫有引數的函式時,需要傳入對應個數的引數。是一個引數,就傳入一個,兩個就是傳入兩個,我們上面interview的例子裡面,如果我們要加上顯示出面試者的名字,就可以這樣

def interview(interviewee):
 print("求職者是 " + interviewee)
 print("把求職者帶到3號會議室")
 print("請求職者 完成答卷")
 print("讓測試經理來面試 求職者")
 print("讓技術總監面試 求職者")
interview('王小五')

我們在定義的時候,並不知道將來呼叫的時候是誰來面試。但是沒有關係。可以作為引數,定義在這裡。面試者來了,我們在呼叫函式的時候,會將面試者的名字作為引數傳遞過來。再執行

interview('王小五')

的時候, 直譯器就會到 函式 interview 準備去執行裡面的程式碼,並且在執行函式程式碼前,會將引數變數interviewee 賦值為 '王小五'

函式的預設引數

假設,我們要實現一個函式,統計學生考試超過指定分數的人數。

def overScoreStudents(studentScoreList, score):
 count = 0
 # 下面的程式碼用到了迴圈和判斷,後面章節會學習到
 for ss in studentScoreList:
 if ss >= score:
 count += 1
 
 return count

在呼叫這個函式的時候,大部分時候 都是統計超過及格分數線60的人數。像這樣

overScoreStudents(ssList,60)

所以,我們呼叫該函式的時候,第二個引數通常都是填寫 60 。這樣顯得就有些麻煩。這時候,可以在定義函式的時候,給它加上預設值,像下面這樣:

def overScoreStudents(studentScoreList, score=60):
 ...

這樣,在在呼叫這個函式的時候,如果score引數還是傳入60 就可以不用寫了,像這樣

overScoreStudents(ssList)

直譯器發現該函式引數score有預設值,就會自動幫我們傳入預設值60 給 引數score。當然如果我們呼叫的時候傳入了引數,比如像下面這樣,score引數就會將 70 傳給引數score。

overScoreStudents(ssList, 70)

相關文章