第三章 過(guò)程大于結(jié)果

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

最后編輯于
?著作權(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)容

  • 原文地址:C語(yǔ)言函數(shù)調(diào)用棧(一)C語(yǔ)言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過(guò)程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個(gè)函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,957評(píng)論 1 19
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,621評(píng)論 1 32
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,235評(píng)論 0 38
  • 有一種預(yù)感,以后的日更內(nèi)容,“隨筆”這樣的題目會(huì)多起來(lái)。 情緒,情感是非常有用的,力量也很強(qiáng)大。但如果是以提升自己...
    來(lái)是春初閱讀 252評(píng)論 0 1
  • 這是一個(gè)小故事。 從前,有一個(gè)商人,牽著馬和驢去趕集。當(dāng)他們從集市上回來(lái)的時(shí)候,就買了很多的物品。這些物品都?jí)涸诹?..
    不信蜜糖變信鹽閱讀 1,031評(píng)論 0 0

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