第八章 程序設計方法論
人生苦短,請用Python。
Life is short. You need Python.
學習目標
- 了解計算思維的概念;
- 掌握自頂向下的設計方法;
- 掌握自底向上的執行過程;
- 了解計算生態和模塊編程思想;
- 掌握Python 第三方庫的安裝方法;
- 掌握Python 源文件的打包方法。
計算思維
- 計算思維是人類科學思維活動的重要組成部分。人類在認識世界、改造世界過程中表現出三種基本的思維特征:
- 以實驗和驗證為特征的實證思維,以物理學科為代表;
- 以推理和演繹為特征的邏輯思維,以數學學科為代表;
- 以設計和構造為特征的計算思維,以計算機學科為代表。
- 計算思維是計算機科學發展到一定程度而提出的,它是人類逐漸意識到計算機解決問題的強大能力后而自然產生的思維模式,具有顯著的時代特性。
- 程序設計是實踐計算思維的重要手段
- 抽象實際問題的計算特性,利用計算機去求解
- 計算思維的本質 是抽象(Abstraction)和自動化(Automation)。
- 在程序設計范疇,計算思維主要反映在理解問題的計算特性、將計算特性抽象為計算問題、通過程序設計語言實現問題的自動求解等幾個方面。
實例:體育競技分析
這是一個模擬體育競技并進行競技分析的實例。
- 從各種球類比賽中抽象一般規則,規則定義如下:
- 兩個球員在一個有四面邊界的場地上用球拍擊球。開始比賽時,其中一個球員首先發球。接下來球員交替擊球,直到可以判定得分為止,這個過程稱為回合。當一名球員未能進行一次合法擊打時,回合結束。未能打中球的球員輸掉這個回合。
- 如果輸掉這個回合的是發球方,那么發球權交給另一方;如果輸掉的是接球方,則仍然由這個回合的發球方繼續發球??傊?,每回合結束,由贏得該回合的一方發球。球員只能在他們自己的發球局中得分。首先達到15 分的球員贏得一局比賽。
- 在計算機模擬中,運動員的能力級別將通過發球方贏得本回合的概率來表示。因此,一個0.6 概率的球員可以在他的發球局有百分之六十的可能性贏得1 分。程序首先接收兩個球員的水平值,然后通過利用這個值采用概率方法模擬多場比賽。程序最后會輸出比賽運行結果。
- 該問題的IPO 模式如下:
- 輸入:兩個球員(球員A 和B)的能力概率,模擬比賽的場次;
- 處理:模擬比賽過程;
- 輸出:球員A 和B 分別贏得球賽的概率
- 抽象這個問題時,將球員失誤、犯規等可能性一并考慮在能力概率中,在每局比賽中,球員A 先發球。一個期望的輸出結果如下
- 模擬比賽數量:500
- 球員A 獲勝場次:268(53.6%)
- 球員B 獲勝場次:232(46.4%)
將結合這個例子介紹自頂向下的設計方法和自底向上的執行方法。
自頂向下設計
程序需要采用自頂向下設計方法,采用自底向上的執行過程。
- 以一個總問題開始,試圖把它表達為很多小問題組成的解決方案。再用同樣的技術依次攻破每個小問題,最終問題變得非常小,以至于可以很容易解決。然后只需把所有的碎片組合起來,就可以得到一個程序
- 自頂向下設計中最重要的是頂層設計。
- 以體育競技分析為例,可以從問題的IPO描述開始。大多數程序都可以簡單將IPO 描述直接用到程序結構設計中,體育競技分析從用戶得到模擬參數模擬比賽,最后輸出結果。
頂層設計
- 步驟1: 打印程序的介紹性信息;
- 步驟2:獲得程序運行需要的參數:probA, probB, n;
- 步驟3:利用球員A 和B 的能力值probA 和probB,模擬n 次比賽;
- 步驟4:輸出球員A 和B 獲勝比賽的場次及概率。
結合體育競技實例介紹了自頂向下的設計過程。從問題輸入輸出確定開始,整體設計逐漸向下進行。每一層以一個大體算法描述,然后逐步細化成代碼,細節被函數封裝
設計過程總結
- 步驟1:將算法表達為一系列小問題;
- 步驟2:為每個小問題設計接口;
- 步驟3:通過將算法表達為接口關聯的多個小問題來細化算法;
- 步驟4:為每個小問題重復上述過程。
自底向上執行
- 開展測試的更好辦法也是將程序分成小部分逐個測試
- 執行中等規模程序的最好方法是從結構圖最底層開始,而不是從頂部開始,然后逐步上升?;蛘哒f,先運行和測試每一個基本函數,再測試由基礎函數組成的整體函數,這樣有助于定位錯誤
pyinstaller 庫的使用
pyinstaller 是將Python 語言腳本(.py 文件)打包成Windows、Linux、Mac OS X 等操作系統下可執行文件的第三方庫
PyInstaller是一個十分有用的第三方庫,它能夠在Windows、Linux、Mac OS X 等操作系統下將Python源文件打包,通過對源文件打包,Python程序可以在沒有安裝Python的環境中運行,也可以作為一個獨立文件方便傳遞和管理。
PyInstaller 需要在命令行(控制臺)下用pip 工具安裝:
:\>pip install pyinstaller 或者
:\>pip3 install pyinstaller
PyInstaller 的官方網站網址為 http://www.pyinstaller.org/
PyInstaller庫會自動將pyinstall 命令安裝到Python 解釋器目錄中,與pip 或pip3命令路徑相同,因此可以直接使用。
使用PyInstaller 庫十分簡單,在Windows 平臺的命令行中輸入Python 源文件名稱,可以使用相對路徑或絕對路徑
:\>pyinstaller dpython.py
或
:\>pyinstaller D:\codes\dpython.py
執行完畢后,源文件所在目錄將生成dist和build 兩個文件夾。其中,build 目錄是pyinstaller存儲臨時文件的目錄,可以安全刪除。最終的打包程序在dist內部的dpython目錄中。目錄中其他文件是可執行文件dpython.exe 的動態鏈接庫
可以通過‐F 參數對Python 源文件生成一個獨立的可執行文件,如下:
:\>pyinstaller -F dpython.py
執行后在dist 目錄中出現了dpython.exe 文件,沒有任何依賴庫,執行它即可。
使用PyInstaller 庫需要注意以下問題:
- 文件路徑中不能出現空格和英文句號(.);
- 源文件必須是UTF‐8 編碼,暫不支持其他編碼類型。采用IDLE 編寫的源文件都保存為UTF‐8 編碼形式,可直接使用。
pyinstall 命令不需要在Python 源文件中增加代碼,只需要通過命令行進行打包即可。‐F 參數最為常用,對于包含第三方庫的源文件,可以使用‐p 添加第三方庫所在路徑。如果第三方庫由pip 安裝且在Python 環境目錄中,則不需要使用‐p 參數。
#練習打包以前的練習程序
計算生態和模塊編程
Python 語言有9萬多個第三方庫,形成了龐大的計算生態,模塊編程思想是Python 語言最大的價值
Python的計算生態
- Python 語言從誕生之初致力于開源開放,建立了全球最大的編程計算生態。
- Python 官方網站提供了第三方庫索引功能:https://pypi.python.org/pypi
- 該頁面列出了Python 語言9 萬多個第三方庫的基本信息,這些函數庫覆蓋信息領域技術所有技術方向。這里需要說明,Python 語言的函數庫并非都采用Python 語言編寫。
膠水語言
由于Python 有非常簡單靈活的編程方式,很多采用C、C++等語言編寫的專業庫可以經過簡單的接口封裝供Python 語言程序調用。這樣的粘性功能使得Python 語言成為了各類編程語言之間的接口,俗稱Python 語言為“膠水語言”。
第三方庫
- Python第三方程序包括庫(library)、模塊(module)、類(class)和程序包(Package)等多種命名
- 統一將這些可重用代碼統稱為“庫”。
- Python 內置的庫稱為標準庫,其他庫稱為第三方庫
- 在計算生態思想指導下,編寫程序的起點不再是探究每個具體算法的邏輯功能和設計,而是盡可能利用第三方庫進行代碼復用,探究運用庫的系統方法。
- 這種像搭積木一樣的編程方式,稱為“模塊編程”
- 每個模塊可能是標準庫、第三方庫、用戶編寫的其他程序或對程序運行有幫助的資源等。
Python 第三方庫的安裝
- 第三方庫需要安裝后才能使用。由于Python 語言經歷了版本更迭過程,而且,第三方庫由全球開發者分布式維護,缺少統一的集中管理,因此,Python的第三方庫曾經一度制約了Python 語言的普及和發展。隨著官方pip 工具的應用,Python 第三方庫的安裝變得十分容易。
- Python 第三方庫依照安裝方式靈活性和難易程度有三個方法,建議讀者依次使用,能夠將第三方庫安裝成功,
- 這三個方法是:pip 工具安裝、自定義安裝和文件安裝。
pip 工具安裝
- 最常用且最高效的Python第三方庫安裝方式是采用pip工具安裝。
- pip是Python官方提供并維護的在線第三方庫安裝工具。
- 對于同時安裝Python 2 和Python 3 環境的系統,建議采用pip3 命令專門為Python 3 版本安裝第三方庫。
- pip 是Python 內置命令,需要通過命令行執行,執行pip -h 命令將列出pip 常用的子命令,注意,不要在IDLE 環境下運行pip 程序。
- pip 支持安裝(install)、下載(download)、卸載(uninstall)、列表(list)、查看(list)、查找(search)等一系列安裝和維護子命令。
- 安裝一個庫的命令格式如下,例如:
pip install <擬安裝庫名>
- 例如,安裝pygame 庫,pip 工具默認從網絡上下載pygame 庫安裝文件并自動安裝到系統中。
pip install pygame
- 使用-U 標簽可以更新已安裝庫的版本,例如,用pip 更新本身:
pip install -U pip
- 卸載一個庫的命令格式如下,例如:
pip uninstall <擬卸載庫名>
- 可以通過list 子命令列出當前系統中已經安裝的第三方庫,例如:
pip list
- pip 是Python 第三方庫最主要的安裝方式,可以安裝超過90%以上的第三方庫。然而,由于一些歷史、技術和政策等原因,還有一些第三方庫無法暫時用pip 安裝,此時,需要其他的安裝方法
自定義安裝
文件安裝
對于上述三種安裝方式,一般優先選擇采用pip 工具安裝,如果安裝失敗,則選擇自定義安裝或者文件安裝(Windows 平臺)。另外,如果需要在沒有網絡條件下安裝Python 第三方庫,請直接采用文件安裝方式。其中,.whl 文件可以通過pip download 指令在有網絡條件的情況下獲得。
實例:pip 安裝腳本
這是一個用pip 安裝第三方庫的例子
pip 安裝腳本
- 實例16共需要安裝20個第三方Python 庫
- 需要注意,庫名是第三方庫常用的名字,pip 安裝用的名字和庫名不一定完全相同,建議采用小寫字符
- 安裝過程請在系統命令行下進行,不在IDLE 中,部分庫會依賴其他函數庫,pip會自動安裝,部分庫下載后需要一個安裝過程,pip 也會自動執行。成功安裝庫后會出現” Successfully installed…”提示
pip 批量安裝Python 庫
如果讀者希望自動安裝這些庫,可以使用Python 標準庫os 的system()函數調用控制臺。
下面給出采用pip 批量安裝Python 庫的方法。
#批量安裝Python庫的程序