3.1 懶人炒菜機(jī)
3.1.1 函數(shù)是什么
- 集合的對(duì)應(yīng)關(guān)系
- 數(shù)據(jù)轉(zhuǎn)換的魔法盒子
- 語(yǔ)句的封裝。輸入數(shù)據(jù)被稱為參數(shù),參數(shù)能影響函數(shù)的行為。
3.1.2 定義函數(shù)
def 函數(shù)名(參數(shù)):
????<執(zhí)行>
????return [表達(dá)式]
- 用關(guān)鍵詞def開頭。
- 參數(shù)可以有多個(gè),也可以完全沒有,但括號(hào)也要保留。
- 函數(shù)定義中的參數(shù)是一個(gè)形式代表來(lái)指代輸入數(shù)據(jù),并非真正數(shù)據(jù),所以又稱為形參。
- 當(dāng)函數(shù)被調(diào)用時(shí),Python將執(zhí)行從屬于函數(shù)的語(yǔ)句,直到從屬語(yǔ)句結(jié)束。
- 關(guān)鍵字return用于說(shuō)明函數(shù)的返回值,即函數(shù)的輸出數(shù)據(jù)。還起到了中止函數(shù)和制定返回值的功能。
- 函數(shù)執(zhí)行到return時(shí)就會(huì)結(jié)束,不管它后面是否還有其他函數(shù)定義語(yǔ)句。
- return后面沒有返回值時(shí),則函數(shù)將返回None。None是Python中的空數(shù)據(jù),用來(lái)表示什么都沒有。
- 關(guān)鍵字return返回多個(gè)值時(shí)等價(jià)于返回一個(gè)有多個(gè)數(shù)據(jù)的元組。
3.1.3 調(diào)用函數(shù)
- 直接使用函數(shù)名,在括號(hào)里加入具體的參數(shù)。此時(shí)的參數(shù)是一個(gè)實(shí)際的數(shù)據(jù)。所以,在函數(shù)調(diào)用時(shí)出現(xiàn)的參數(shù)稱為實(shí)參。
- 如果一個(gè)函數(shù)有其他返回值,那么我們可以獲得這個(gè)返回值
- Python通過(guò)參數(shù)出現(xiàn)的先后位置來(lái)對(duì)應(yīng)形參。
- 參數(shù)可以是程序中已經(jīng)存在的變量。
3.2 參數(shù)傳遞
3.2.1 基本傳參
參數(shù)傳遞:把數(shù)據(jù)用參數(shù)的形式輸入到函數(shù)。
位置傳參:若有多個(gè)參數(shù),那么在調(diào)用函數(shù)時(shí),Python會(huì)根據(jù)位置來(lái)確認(rèn)數(shù)據(jù)對(duì)應(yīng)哪個(gè)參數(shù)。
關(guān)鍵字傳參:在定義函數(shù)時(shí),我們給了形參一個(gè)符號(hào)標(biāo)記,即參數(shù)名。根據(jù)參數(shù)名來(lái)讓數(shù)據(jù)與符號(hào)對(duì)應(yīng)上。
混合使用:一部分的參數(shù)傳遞根據(jù)位置,另一部分根據(jù)參數(shù)名。在所有的位置參數(shù)都要出現(xiàn)在關(guān)鍵字參數(shù)之前。
形參默認(rèn)值:調(diào)用時(shí)若不提供這些形參的具體數(shù)據(jù),那么它們將采用定義時(shí)的默認(rèn)值。
3.2.2 包裹傳參
包裹傳參:在不知道參數(shù)的個(gè)數(shù)時(shí)使用。
包裹位置傳參:在調(diào)用函數(shù)時(shí),所有的數(shù)據(jù)都根據(jù)先后順序,收集到一個(gè)元組。 在函數(shù)內(nèi)部,我們可以通過(guò)元組來(lái)讀取傳入的數(shù)據(jù)。定義函數(shù)時(shí)在元組名前加*號(hào)。
包裹關(guān)鍵字傳參:與包裹位置傳參相似,但數(shù)據(jù)容器為字典。每個(gè)關(guān)鍵字形式的參數(shù)調(diào)用,都會(huì)成為字典的一個(gè)元素。參數(shù)名成為元素的鍵,而數(shù)據(jù)成為元素的值。定義函數(shù)時(shí)在字典名前加**。
混合使用:
- 包裹位置傳參和包裹關(guān)鍵字傳參混合使用:定義函數(shù)時(shí)先寫*元組名再寫 **字典名。
- 包裹傳參和基本傳參混合使用: 先后順序 位置→關(guān)鍵字→包裹位置→包裹關(guān)鍵字
3.2.3 解包裹
解包裹:把一個(gè)數(shù)據(jù)容器傳遞給函數(shù),再自動(dòng)地分解為各個(gè)參數(shù)。
- 在序列名前加*號(hào)。
- 在詞典前加**號(hào),每個(gè)鍵值對(duì)作為一個(gè)關(guān)鍵字傳遞給函數(shù)。
- 混合使用原則:位置→關(guān)鍵字→位置解包裹→關(guān)鍵字解包裹。
3.3 遞歸
3.3.1 高斯求和與數(shù)學(xué)歸納法
高斯求和公式:1+2+3+4+……+ n = (n+1)n /2
遞歸:在一個(gè)函數(shù)定義中,調(diào)用了這個(gè)函數(shù)自身。
- 關(guān)鍵是說(shuō)明緊鄰的兩個(gè)步驟之間的銜接條件。
- 要求程序有一個(gè)能夠達(dá)到的終止條件防止死循環(huán)。
數(shù)學(xué)歸納法:
證明某個(gè)命題對(duì)于自然數(shù)n成立:
1.證明命題對(duì)于n = 1成立。
2.假設(shè)命題對(duì)于n成立,n為任意自然數(shù),則證明在此假設(shè)下,命題對(duì)于 n+1成立。
命題得證。
3.3.2 函數(shù)棧
數(shù)據(jù)結(jié)構(gòu):計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的組織方式。
棧:數(shù)據(jù)結(jié)構(gòu)的一種,可以有序地存儲(chǔ)數(shù)據(jù)。后進(jìn)后出。
幀:棧的元素。
彈出 pop:取出棧頂元素。
推入 push:將一個(gè)新的元素存入棧頂。
程序運(yùn)行:先增長(zhǎng)棧后消滅棧。每次函數(shù)調(diào)用,都伴隨著一個(gè)幀入棧。如果函數(shù)內(nèi)部還有函數(shù)調(diào)用,那么又會(huì)多一個(gè)幀入棧。當(dāng)函數(shù)返回時(shí),相應(yīng)的幀會(huì)出棧。等到程序的最后,棧清空,程序就完成了。
3.3.3 變量的作用域
- Python尋找變量的范圍不止是當(dāng)前幀。它還會(huì)尋找函數(shù)外部,也就是Python的主程序中定義了的變量。
- 當(dāng)主程序中已經(jīng)有了一個(gè)變量,函數(shù)調(diào)用內(nèi)部可以通過(guò)賦值的方式再創(chuàng)建了一個(gè)同名變量。函數(shù)會(huì)優(yōu)先使用自己函數(shù)幀中的那個(gè)變量。且函數(shù)內(nèi)部使用的是自己內(nèi)部的那一份,所以函數(shù)內(nèi)部對(duì)變量的操作不會(huì)影響到外部同名變量。
- 在函數(shù)調(diào)用時(shí),會(huì)把數(shù)據(jù)賦值給變量。等到函數(shù)返回時(shí),這些參數(shù)相關(guān)的變量會(huì)被清空。
- 對(duì)于數(shù)據(jù)容器來(lái)說(shuō),函數(shù)內(nèi)部的更改會(huì)影響到外部。
3.4 引入那把寶劍
3.4.1 引入模塊
模塊:是一個(gè) Python 文件,以 .py 結(jié)尾,包含了 Python 對(duì)象定義和Python語(yǔ)句。能定義函數(shù),類和變量,模塊里也能包含可執(zhí)行的代碼。是比函數(shù)更高一層的封裝模式。
引入 import:引入模塊,調(diào)用其他文件中的函數(shù)或數(shù)據(jù)。
3.4.2 搜索路徑
庫(kù):具有相關(guān)功能模塊的集合。
- 標(biāo)準(zhǔn)庫(kù):Python官方提供的庫(kù)。
- 第三方庫(kù):由其他的第三方機(jī)構(gòu)發(fā)布提供的庫(kù)。
尋找?guī)斓穆窂?/strong>:
- 當(dāng)前文件夾。
- 標(biāo)準(zhǔn)庫(kù)的安裝路徑。
- 操作系統(tǒng)環(huán)境變量PYTHONPATH所包含的路徑??梢孕薷腜YTHONPATH這個(gè)環(huán)境變量,當(dāng)PYTHONPATH包含模塊所在的路徑時(shí),Python便可以找到那個(gè)模塊。
3.5 異常處理
3.5.1 惱人的bug
bug:程序缺陷,會(huì)引發(fā)錯(cuò)誤或者意想不到的后果。
運(yùn)行時(shí)錯(cuò)誤:只有在運(yùn)行時(shí)編譯器才會(huì)發(fā)現(xiàn)的錯(cuò)誤。。由于Python是動(dòng)態(tài)語(yǔ)言,許多操作必須在運(yùn)行時(shí)才會(huì)執(zhí)行,因此,Python要比靜態(tài)語(yǔ)言更容易產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。
語(yǔ)義錯(cuò)誤:編譯器認(rèn)為你的程序沒有問(wèn)題,可以正常運(yùn)行。但當(dāng)檢查程序時(shí),卻發(fā)現(xiàn)程序并非你想做的。
3.5.2 Debug
debug:修改程序缺陷的過(guò)程。
- 在程序內(nèi)部插入簡(jiǎn)單的print()函數(shù),就可以查看變量的狀態(tài)以及運(yùn)行進(jìn)度。
- 將某個(gè)指令替換成其他形式,看看程序結(jié)果有何變化,從而驗(yàn)證自己的假設(shè)。
3.5.3 異常處理
異常處理:
- 讓程序中止前進(jìn)行更多的操作,比如提供更多的關(guān)于錯(cuò)誤的信息。
- 是讓程序在犯錯(cuò)后依然能運(yùn)行下去。
try:
????...
except exception1:
????...
except exception2:
????...
else:
????...
finally:
????...
- 如果try中有異常發(fā)生時(shí),將執(zhí)行異常的歸屬,執(zhí)行except。異常層層比較, 看是否是exception1、exception2……直到找到其歸屬,執(zhí)行相應(yīng)的except中的 語(yǔ)句。如果try中沒有異常,那么except部分將跳過(guò),執(zhí)行else中的語(yǔ)句。
- finally是無(wú)論是否有異常,最后都要做的一些事情。
- 如果except后面沒有任何參數(shù),那么表示所有的exception都交給這段程序處理。
- 如果無(wú)法將異常交給合適的對(duì)象,那么異常將繼續(xù)向上層拋出,直到被捕捉或者造成主程序報(bào)錯(cuò)
raise:在程序中主動(dòng)拋出異常。
代碼地址:https://gitee.com/sibyltui/learn_programming_from_python