程式設計導論(Python)讀書筆記1
Python語言實踐
函式和模組
程式設計基本元素 常見錯誤: Python2中預設的編碼格式是 ASCII 格式,在沒修改編碼格式時無法正確列印漢字,所以在讀取中文時會報錯。 解決方法為只要在檔案開頭加入 # -- coding: UTF-8 -- 或者 #coding=utf-8 就行了 通過在命令列上提供引數來定製程式行為。如最小批次、週期數、學習率。 1.ImportError:No module name nltk常見錯誤: 解決辦法:上Stack Overflow或github查詢相關模組安裝方法,在虛擬環境一般用pip 2.SyntaxError:invaild syntax 解決辦法:程式中包含錯誤,檢視引數設定或修改語法錯誤 3.版本衝突:keras會出現版本問題,老的程式碼需要降低keras版本,tensorflow與cudnn需對應 在python中,所有的資料都表示為物件及物件之間的關係,python物件是特定資料型別的值在記憶體中的表現方式。每個物件由其標誌、型別和值三者標識。 資料型別是一系列值及定義在這些值上的一系列操作
成為優秀程式設計師:當需要某個軟體工具時,有足夠的信心建立所需要的軟體工具,而且必須要有足夠的智慧懂得何時適合從現有的模組中尋求參考解決方案!!!
面向物件的程式設計
方法:將大型和複雜的程式分解為一系列互動的元素或物件 思想:對現實世界的實體進行建模
方法與函式的區別:方法與特定的物件關聯。我們可以認為這個特定的物件是傳遞給函式的除了通常方法引數外的一個額外引數。程式碼中體現為函式呼叫使用模組名,方法呼叫使用變數名。
理念一:使用一個數據型別時無須理解其具體實現 str(字串)的API中運算操作三類別: 1.內建運算子:+、+=、[]、[:]、in、not in以及比較運算子,其特徵是使用特別的符號和語法。 2.內建函式:len(),使用標準函式呼叫語法 3.方法:upper()、startwith()、find()等,在API中使用變數名跟點運算子區分。 使用者自定義資料型別:應用程式程式設計介面、檔案命名規則、建立物件、呼叫方法、字串表示
在概念層面上,一個數據型別是一系列值及定義在這些值上的一系列操作的集合。在具體層面上,我們使用資料型別來建立物件。一個物件具有三個基本屬性:標識、型別和值(或狀態)。 標識(identity):一個物件的標識是其在計算機記憶體中的儲存位置,用於唯一標示該物件; 型別(type):一個物件的型別完全指定物件的行為,即該物件支援的一系列運算操作; 值(value或狀態state):一個物件的值是物件當前表示的資料型別的值。 區分使用者自定義資料型別和內建資料型別之間的異同點。 自定義資料型別檔案需放置在與客戶端程式碼相同的目錄中或使用作業系統的路徑環境變數進行設定。 記憶體管理:在python中,通過呼叫建構函式建立物件,每次建立一個物件時,python為該物件預留一段記憶體,何時建立何時銷燬物件,使其佔用的記憶體可以釋放並重用。 孤立物件:一個程式建立的物件不再被引用。 記憶體管理:一種機制建立物件並分配記憶體,當物件成為孤立物件時銷燬物件並釋放記憶體,系統無法預測一個程式的執行操作,需監控系統的執行從而採取相應的措施。 記憶體洩漏:程式設計師忘記去釋放孤立物件所佔據的記憶體空間。 垃圾回收:自動記憶體管理,解放程式設計師管理記憶體的責任,通過跟蹤孤立物件,並返回其佔用的記憶體到空閒的記憶體池。 建立一個數據型別: 1.設計其API。API的目的是把客戶端與實現分離開,從而促進模組化程式設計。設計API時有兩個目標:客戶端程式碼清晰和正確,必須能夠實現這些運算操作。 2.實現一個Python類以滿足其API規範。首先編寫建構函式以定義和初始化例項變數。其次,編寫方法處理例項變數以實現所需要的功能。在python中通常需要實現三種類型的方法: ~.為實現一個建構函式,實現一個特殊方法__init__(),其第一個引數變數為self,隨後跟建構函式的普通引數變數。 ~.為實現一個方法,實現一個指定名稱的函式,其第一個引數變數為self,隨後跟建構函式的普通引數變數。 ~.為實現一個內建函式,實現一個函式名的前後均帶雙下劃線的特殊方法,其第一個引數變數為self。 3.編寫一個測試客戶端,以驗證和測試前兩步的設計和實現是否正確。 方法包含的三種類型變數:self物件的例項變數、方法的引數變數、區域性變數
設計資料型別 設計理念:在計算任務中,任何時候只要可以清晰地分離資料和相關操作,則建議分離資料和相關操作。 資料型別的API包含若干方法和這些方法所提供功能的簡介描述。 注意:標準、規範問題、寬介面、從客戶端程式碼開始、避免對錶示方法的依賴、陷阱{為客戶端提供其所需的方法,僅此而已) 將客戶端和實現分離開從而隱藏資訊的過程稱為封裝。封裝實現模組化設計、提高除錯效率、使程式碼更加清晰簡潔。封裝允許我們獨立開發客戶端和實現程式碼、替換使用改進的實現版本而不會影響客戶端、支援尚未編寫的客戶端,封裝可以進行分離資料型別的操作,在實現的程式碼中增加一致性檢查和其他除錯工具,使客戶端程式碼更加清晰。 注意:模組化程式設計、修改API(客戶端量多不隨意改)、改變實現持續改進軟體、私有性(客戶端沒有理由直接訪問一個例項變數)、規劃未來(封裝資料型別)、限制潛在的錯誤、程式碼清晰度(精確地指定資料型別) 不可變物件優點:容易使用不會誤用、容易除錯。代價:必須為每一個值建立一個新的物件。強制不可變:保持一個數據型別不可變,並確保在實現程式碼中不修改任何物件的值。防禦拷貝:實現程式碼拷貝例項變數。 元組:在元素無需改變的情況下必須使用元組。 多型性:可帶不同型別引數的方法或函式。最好與最壞的多型性:非預期型別。 鴨子型別:無需顯式宣告一個變數的型別。原則:方法/函式無需關心一個物件的型別,只需瞭解客戶端是否可以在一個物件上執行需要的操作。不足:無法準確判斷客戶端和實現之間的契約,特別是一個需要的方法以間接方式提供的時候。資訊缺失倒置執行錯誤、語義錯誤。 運算子過載注意:特殊方法、算術運算子、等性運算子(引用相等和物件相等)、雜湊法(條件是一個物件可以通過==運算子與其他物件比較相等性、當兩個物件比較的結果為相等時,其雜湊碼相同、一個物件的雜湊碼在其生存期內保持不變)通過實現兩個特殊方法_hash_()和_eq_()可以使一個使用者自定義的資料型別可雜湊。、比較運算子須定義一種全序關係(屬性有反對稱性、傳遞性、完全性)、其他運算子、內建函式。 函式是物件,意味著函式可以作為函式的引數和結果返回值。 繼承:定義類之間關係的語言支援。優點;程式碼重用、可擴充套件。缺點:與封裝違背、脆弱的基類問題、子類程式碼可以訪問例項變數。 應用:資料探勘 文件關聯摘要向量、抽象文件、計算文件摘要、雜湊法、比較文件摘要、比較所有的文件對、查詢相似文件 語言機制:契約式設計 異常:程式執行時發生的破壞性事件,通常表示為一種錯誤。相應採取的措施稱為丟擲異常。 斷言:是在程式中某個位置確定應該為true的一個布林表示式。如果表示式為false則程式會在執行時丟擲異常AssertionError。程式設計師使用斷言來測試錯誤並確保程式的正確性。斷言還有描述程式意圖的作用。