第五章1:創(chuàng)建和調(diào)用函數(shù)
函數(shù)
本周開(kāi)始函數(shù)主題,與循環(huán)相比,函數(shù)是一個(gè)相對(duì)難以理解的話(huà)題,因此本周將一直持續(xù)函數(shù)這個(gè)話(huà)題。這也是編程中比較重要的話(huà)題之一。了解如何使用函數(shù)會(huì)大大提高我們編程的水平。
函數(shù)能夠使我們的代碼更加強(qiáng)大和簡(jiǎn)潔同時(shí)也能節(jié)省我們的時(shí)間。雖然我們會(huì)在第一天討論他們的工作原理,但我們使用函數(shù)的原因是函數(shù)具有一次編寫(xiě)和多次復(fù)用的特性。
許多我們之前已經(jīng)編寫(xiě)的程序都受益于函數(shù)的使用,尤其是像Hangman這樣的游戲。在這周結(jié)束時(shí),我們會(huì)編寫(xiě)一個(gè)類(lèi)似于購(gòu)物車(chē)的項(xiàng)目。我們將看到為什么把任務(wù)分開(kāi)是很重要的,比如把添加、刪除和展示劃分到單獨(dú)的函數(shù)中。
本章概覽
如何使用函數(shù)以及它們是什么
使用參數(shù)傳遞數(shù)據(jù)
從函數(shù)返回?cái)?shù)據(jù)
理解作用域及其重要性
創(chuàng)建一個(gè)購(gòu)物車(chē)程序
記住,一個(gè)算法只不過(guò)是一組一步一步的指令的集合。如果我們要寫(xiě)一個(gè)換燈泡的算法,它會(huì)是什么樣子?哪些問(wèn)題是你必須考慮的?需要多少步驟?最有效的方法是什么?使用下面的算法,可能會(huì)出現(xiàn)什么問(wèn)題?
找一個(gè)備用燈泡。
關(guān)閉電源開(kāi)關(guān)。
擰下當(dāng)前燈泡。
換上備用燈泡。
打開(kāi)新燈泡的電源開(kāi)關(guān)。
如果備用燈泡沒(méi)有打開(kāi),重復(fù)步驟1到5。
周一: 創(chuàng)建和調(diào)用函數(shù)
今天的課程是關(guān)于理解什么是函數(shù),函數(shù)的各個(gè)階段,以及如何編寫(xiě)函數(shù)。我們會(huì)發(fā)現(xiàn)為什么函數(shù)在程序中如此重要以及函數(shù)如何使我們的編程體驗(yàn)更美好。
為了跟進(jìn)今天的內(nèi)容,讓我們從“python_bootcamp”文件夾打開(kāi)我們Jupyter Notebook。打開(kāi)后,創(chuàng)建一個(gè)新文件,并將其重命名為“Week_05”。接下來(lái),創(chuàng)建一個(gè)markdown的單元格名為“創(chuàng)建&調(diào)用函數(shù)”。我們將在這個(gè)單元格中寫(xiě)代碼。
什么是函數(shù)?
函數(shù)是一段代碼,它只在被調(diào)用時(shí)才會(huì)運(yùn)行。
您可以將數(shù)據(jù)(稱(chēng)為參數(shù))傳遞到函數(shù)中。
函數(shù)可以返回?cái)?shù)據(jù)作為結(jié)果。
程序經(jīng)常需要重復(fù)運(yùn)行相同的代碼,盡管循環(huán)有助于這一點(diǎn),但我們不希望在整個(gè)程序中多次編寫(xiě)相同的循環(huán)。這個(gè)問(wèn)題的解決方案是使用一個(gè)函數(shù)。函數(shù)的代碼只會(huì)在調(diào)用時(shí)運(yùn)行。
所有的函數(shù)通常都與一個(gè)任務(wù)或過(guò)程相關(guān)聯(lián)。這使得我們更容易將程序拆分為函數(shù)。如果你構(gòu)建一個(gè)需要重復(fù)打印5行信息的程序,并且需要在5個(gè)不同的地方輸出它,那么需要編寫(xiě)25行代碼。使用一個(gè)函數(shù),你可以將這5行代碼存儲(chǔ)在一個(gè)塊中,并在需要時(shí)調(diào)用該函數(shù),結(jié)果是5行用于輸出信息,5行用于調(diào)用函數(shù),總共有10行代碼。這會(huì)是一個(gè)更高效的程序。
函數(shù)語(yǔ)法
與循環(huán)一樣,函數(shù)的創(chuàng)建遵循固定的結(jié)構(gòu)。它們都以關(guān)鍵字“def”開(kāi)頭,后面跟著函數(shù)名。這個(gè)名稱(chēng)是除了Python關(guān)鍵字和先前定義的函數(shù)之外的任何名稱(chēng)。函數(shù)名后面是圓括號(hào),這些括號(hào)內(nèi)是參數(shù)。我們將在明天討論參數(shù),所以只需知道參數(shù)是可選的,但括號(hào)是必需的。最后,我們需要一個(gè)像其他Python語(yǔ)句一樣的結(jié)束冒號(hào)。示例見(jiàn)圖5-1

編寫(xiě)你的第一個(gè)函數(shù)
現(xiàn)在我們知道語(yǔ)法結(jié)構(gòu)是什么樣后,讓我們來(lái)寫(xiě)自己的函數(shù):
# 編寫(xiě)你的第一個(gè)函數(shù)
def printInfo():# 定義一個(gè)函數(shù)
print("Name: John Smith")
print("Age: 45")
printInfo( ) # 調(diào)用函數(shù)
printInfo( ) # 再次調(diào)用函數(shù)
繼續(xù)并運(yùn)行單元格。我們定義了一個(gè)名為printInfo的函數(shù),它在每次被調(diào)用時(shí)打印兩行信息。下面我們調(diào)用函數(shù)兩次,它輸出信息兩次。這看起來(lái)似乎沒(méi)什么卵用,但如果你需要在一個(gè)程序中輸出20次信息,那么它是非常簡(jiǎn)潔和高效的。
函數(shù)的階段
在Python中,每個(gè)函數(shù)有兩個(gè)階段。第一階段是函數(shù)定義。這個(gè)階段定義函數(shù)的名稱(chēng),它應(yīng)該接受的任何參數(shù),以及它應(yīng)該在與之關(guān)聯(lián)的代碼塊中做什么。見(jiàn)圖5-2。

第二個(gè)階段稱(chēng)為函數(shù)調(diào)用。函數(shù)在被調(diào)用之前永遠(yuǎn)不會(huì)運(yùn)行,因此你可以定義任意多個(gè)函數(shù),如果你從未調(diào)用其中一個(gè)函數(shù),就不會(huì)發(fā)生任何事情。當(dāng)你調(diào)用一個(gè)函數(shù)時(shí),它會(huì)運(yùn)行函數(shù)定義中的代碼。
用戶(hù)自定義函數(shù)VS內(nèi)置函數(shù)
在不知不覺(jué)中,你一直在用函數(shù)。諸如range、print、len等函數(shù)都被稱(chēng)為“內(nèi)置”函數(shù)。之所以包含在python中,是因?yàn)樗鼈兙哂袔椭鷺?gòu)建應(yīng)用程序的特定用途。現(xiàn)在我們正在學(xué)習(xí)函數(shù),我們可以開(kāi)始創(chuàng)建我們自己的“用戶(hù)自定義函數(shù)”。
實(shí)現(xiàn)一個(gè)計(jì)算器
讓我們?cè)倏匆粋€(gè)基本函數(shù)的例子,但這次不僅僅在函數(shù)內(nèi)部打印信息:
# 在函數(shù)內(nèi)執(zhí)行計(jì)算
def calc( ):
x, y = 5, 10
print(x + y)
calc( ) # 將會(huì)運(yùn)行計(jì)算代碼并輸出15
繼續(xù)并運(yùn)行單元格。每次調(diào)用calc函數(shù),我們都會(huì)得到一個(gè)15的輸出。
myName:定義一個(gè)myName函數(shù),調(diào)用時(shí)讓其打印你的名字 pizzaToppings:定義一個(gè) pizzaToppings函數(shù),打印出所有你喜歡的披薩配料,并且調(diào)用其三次
雖然今天沒(méi)有寫(xiě)太多的代碼,但是理解函數(shù)的價(jià)值是對(duì)我們來(lái)說(shuō)是至關(guān)重要的。現(xiàn)在我們可以將代碼拆分為函數(shù)塊,這會(huì)使得程序更加容易閱讀和運(yùn)行。
