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