第八章 程序設(shè)計(jì)方法論
人生苦短,請(qǐng)用Python疹鳄。
Life is short. You need Python.
學(xué)習(xí)目標(biāo)
- 了解計(jì)算思維的概念坯苹;
- 掌握自頂向下的設(shè)計(jì)方法犀农;
- 掌握自底向上的執(zhí)行過程;
- 了解計(jì)算生態(tài)和模塊編程思想硫眯;
- 掌握Python 第三方庫的安裝方法蕴侧;
- 掌握Python 源文件的打包方法。
計(jì)算思維
- 計(jì)算思維是人類科學(xué)思維活動(dòng)的重要組成部分两入。人類在認(rèn)識(shí)世界净宵、改造世界過程中表現(xiàn)出三種基本的思維特征:
- 以實(shí)驗(yàn)和驗(yàn)證為特征的實(shí)證思維,以物理學(xué)科為代表;
- 以推理和演繹為特征的邏輯思維择葡,以數(shù)學(xué)學(xué)科為代表紧武;
- 以設(shè)計(jì)和構(gòu)造為特征的計(jì)算思維,以計(jì)算機(jī)學(xué)科為代表敏储。
- 計(jì)算思維是計(jì)算機(jī)科學(xué)發(fā)展到一定程度而提出的阻星,它是人類逐漸意識(shí)到計(jì)算機(jī)解決問題的強(qiáng)大能力后而自然產(chǎn)生的思維模式,具有顯著的時(shí)代特性已添。
- 程序設(shè)計(jì)是實(shí)踐計(jì)算思維的重要手段
- 抽象實(shí)際問題的計(jì)算特性妥箕,利用計(jì)算機(jī)去求解
- 計(jì)算思維的本質(zhì) 是抽象(Abstraction)和自動(dòng)化(Automation)。
- 在程序設(shè)計(jì)范疇更舞,計(jì)算思維主要反映在理解問題的計(jì)算特性畦幢、將計(jì)算特性抽象為計(jì)算問題、通過程序設(shè)計(jì)語言實(shí)現(xiàn)問題的自動(dòng)求解等幾個(gè)方面缆蝉。
實(shí)例:體育競(jìng)技分析
這是一個(gè)模擬體育競(jìng)技并進(jìn)行競(jìng)技分析的實(shí)例宇葱。
- 從各種球類比賽中抽象一般規(guī)則,規(guī)則定義如下:
- 兩個(gè)球員在一個(gè)有四面邊界的場(chǎng)地上用球拍擊球返奉。開始比賽時(shí)贝搁,其中一個(gè)球員首先發(fā)球。接下來球員交替擊球芽偏,直到可以判定得分為止雷逆,這個(gè)過程稱為回合。當(dāng)一名球員未能進(jìn)行一次合法擊打時(shí)污尉,回合結(jié)束膀哲。未能打中球的球員輸?shù)暨@個(gè)回合。
- 如果輸?shù)暨@個(gè)回合的是發(fā)球方被碗,那么發(fā)球權(quán)交給另一方某宪;如果輸?shù)舻氖墙忧蚍剑瑒t仍然由這個(gè)回合的發(fā)球方繼續(xù)發(fā)球锐朴⌒宋梗總之,每回合結(jié)束焚志,由贏得該回合的一方發(fā)球衣迷。球員只能在他們自己的發(fā)球局中得分。首先達(dá)到15 分的球員贏得一局比賽酱酬。
- 在計(jì)算機(jī)模擬中壶谒,運(yùn)動(dòng)員的能力級(jí)別將通過發(fā)球方贏得本回合的概率來表示。因此膳沽,一個(gè)0.6 概率的球員可以在他的發(fā)球局有百分之六十的可能性贏得1 分汗菜。程序首先接收兩個(gè)球員的水平值让禀,然后通過利用這個(gè)值采用概率方法模擬多場(chǎng)比賽。程序最后會(huì)輸出比賽運(yùn)行結(jié)果陨界。
- 該問題的IPO 模式如下:
- 輸入:兩個(gè)球員(球員A 和B)的能力概率巡揍,模擬比賽的場(chǎng)次;
- 處理:模擬比賽過程普碎;
- 輸出:球員A 和B 分別贏得球賽的概率
- 抽象這個(gè)問題時(shí)吼肥,將球員失誤、犯規(guī)等可能性一并考慮在能力概率中麻车,在每局比賽中缀皱,球員A 先發(fā)球。一個(gè)期望的輸出結(jié)果如下
- 模擬比賽數(shù)量:500
- 球員A 獲勝場(chǎng)次:268(53.6%)
- 球員B 獲勝場(chǎng)次:232(46.4%)
將結(jié)合這個(gè)例子介紹自頂向下的設(shè)計(jì)方法和自底向上的執(zhí)行方法动猬。
自頂向下設(shè)計(jì)
程序需要采用自頂向下設(shè)計(jì)方法啤斗,采用自底向上的執(zhí)行過程。
- 以一個(gè)總問題開始赁咙,試圖把它表達(dá)為很多小問題組成的解決方案钮莲。再用同樣的技術(shù)依次攻破每個(gè)小問題,最終問題變得非常小彼水,以至于可以很容易解決崔拥。然后只需把所有的碎片組合起來,就可以得到一個(gè)程序
- 自頂向下設(shè)計(jì)中最重要的是頂層設(shè)計(jì)凤覆。
- 以體育競(jìng)技分析為例链瓦,可以從問題的IPO描述開始。大多數(shù)程序都可以簡(jiǎn)單將IPO 描述直接用到程序結(jié)構(gòu)設(shè)計(jì)中盯桦,體育競(jìng)技分析從用戶得到模擬參數(shù)模擬比賽慈俯,最后輸出結(jié)果。
頂層設(shè)計(jì)
- 步驟1: 打印程序的介紹性信息拥峦;
- 步驟2:獲得程序運(yùn)行需要的參數(shù):probA, probB, n贴膘;
- 步驟3:利用球員A 和B 的能力值probA 和probB,模擬n 次比賽略号;
- 步驟4:輸出球員A 和B 獲勝比賽的場(chǎng)次及概率刑峡。
結(jié)合體育競(jìng)技實(shí)例介紹了自頂向下的設(shè)計(jì)過程。從問題輸入輸出確定開始玄柠,整體設(shè)計(jì)逐漸向下進(jìn)行氛琢。每一層以一個(gè)大體算法描述,然后逐步細(xì)化成代碼随闪,細(xì)節(jié)被函數(shù)封裝
設(shè)計(jì)過程總結(jié)
- 步驟1:將算法表達(dá)為一系列小問題;
- 步驟2:為每個(gè)小問題設(shè)計(jì)接口骚勘;
- 步驟3:通過將算法表達(dá)為接口關(guān)聯(lián)的多個(gè)小問題來細(xì)化算法铐伴;
- 步驟4:為每個(gè)小問題重復(fù)上述過程撮奏。
自底向上執(zhí)行
- 開展測(cè)試的更好辦法也是將程序分成小部分逐個(gè)測(cè)試
- 執(zhí)行中等規(guī)模程序的最好方法是從結(jié)構(gòu)圖最底層開始,而不是從頂部開始当宴,然后逐步上升畜吊。或者說户矢,先運(yùn)行和測(cè)試每一個(gè)基本函數(shù)玲献,再測(cè)試由基礎(chǔ)函數(shù)組成的整體函數(shù),這樣有助于定位錯(cuò)誤
pyinstaller 庫的使用
pyinstaller 是將Python 語言腳本(.py 文件)打包成Windows梯浪、Linux捌年、Mac OS X 等操作系統(tǒng)下可執(zhí)行文件的第三方庫
PyInstaller是一個(gè)十分有用的第三方庫,它能夠在Windows挂洛、Linux礼预、Mac OS X 等操作系統(tǒng)下將Python源文件打包,通過對(duì)源文件打包虏劲,Python程序可以在沒有安裝Python的環(huán)境中運(yùn)行托酸,也可以作為一個(gè)獨(dú)立文件方便傳遞和管理。
PyInstaller 需要在命令行(控制臺(tái))下用pip 工具安裝:
:\>pip install pyinstaller 或者
:\>pip3 install pyinstaller
PyInstaller 的官方網(wǎng)站網(wǎng)址為 http://www.pyinstaller.org/
PyInstaller庫會(huì)自動(dòng)將pyinstall 命令安裝到Python 解釋器目錄中柒巫,與pip 或pip3命令路徑相同励堡,因此可以直接使用。
使用PyInstaller 庫十分簡(jiǎn)單堡掏,在Windows 平臺(tái)的命令行中輸入Python 源文件名稱应结,可以使用相對(duì)路徑或絕對(duì)路徑
:\>pyinstaller dpython.py
或
:\>pyinstaller D:\codes\dpython.py
執(zhí)行完畢后,源文件所在目錄將生成dist和build 兩個(gè)文件夾布疼。其中摊趾,build 目錄是pyinstaller存儲(chǔ)臨時(shí)文件的目錄,可以安全刪除游两。最終的打包程序在dist內(nèi)部的dpython目錄中砾层。目錄中其他文件是可執(zhí)行文件dpython.exe 的動(dòng)態(tài)鏈接庫
可以通過‐F 參數(shù)對(duì)Python 源文件生成一個(gè)獨(dú)立的可執(zhí)行文件,如下:
:\>pyinstaller -F dpython.py
執(zhí)行后在dist 目錄中出現(xiàn)了dpython.exe 文件贱案,沒有任何依賴庫肛炮,執(zhí)行它即可。
使用PyInstaller 庫需要注意以下問題:
- 文件路徑中不能出現(xiàn)空格和英文句號(hào)(.)宝踪;
- 源文件必須是UTF‐8 編碼侨糟,暫不支持其他編碼類型。采用IDLE 編寫的源文件都保存為UTF‐8 編碼形式瘩燥,可直接使用秕重。
pyinstall 命令不需要在Python 源文件中增加代碼,只需要通過命令行進(jìn)行打包即可厉膀。‐F 參數(shù)最為常用溶耘,對(duì)于包含第三方庫的源文件二拐,可以使用‐p 添加第三方庫所在路徑。如果第三方庫由pip 安裝且在Python 環(huán)境目錄中凳兵,則不需要使用‐p 參數(shù)百新。
#練習(xí)打包以前的練習(xí)程序
計(jì)算生態(tài)和模塊編程
Python 語言有9萬多個(gè)第三方庫,形成了龐大的計(jì)算生態(tài)庐扫,模塊編程思想是Python 語言最大的價(jià)值
Python的計(jì)算生態(tài)
- Python 語言從誕生之初致力于開源開放饭望,建立了全球最大的編程計(jì)算生態(tài)。
- Python 官方網(wǎng)站提供了第三方庫索引功能:https://pypi.python.org/pypi
- 該頁面列出了Python 語言9 萬多個(gè)第三方庫的基本信息形庭,這些函數(shù)庫覆蓋信息領(lǐng)域技術(shù)所有技術(shù)方向铅辞。這里需要說明,Python 語言的函數(shù)庫并非都采用Python 語言編寫碘勉。
膠水語言
由于Python 有非常簡(jiǎn)單靈活的編程方式巷挥,很多采用C、C++等語言編寫的專業(yè)庫可以經(jīng)過簡(jiǎn)單的接口封裝供Python 語言程序調(diào)用验靡。這樣的粘性功能使得Python 語言成為了各類編程語言之間的接口倍宾,俗稱Python 語言為“膠水語言”。
第三方庫
- Python第三方程序包括庫(library)胜嗓、模塊(module)高职、類(class)和程序包(Package)等多種命名
- 統(tǒng)一將這些可重用代碼統(tǒng)稱為“庫”。
- Python 內(nèi)置的庫稱為標(biāo)準(zhǔn)庫辞州,其他庫稱為第三方庫
- 在計(jì)算生態(tài)思想指導(dǎo)下怔锌,編寫程序的起點(diǎn)不再是探究每個(gè)具體算法的邏輯功能和設(shè)計(jì),而是盡可能利用第三方庫進(jìn)行代碼復(fù)用变过,探究運(yùn)用庫的系統(tǒng)方法埃元。
- 這種像搭積木一樣的編程方式,稱為“模塊編程”
- 每個(gè)模塊可能是標(biāo)準(zhǔn)庫媚狰、第三方庫岛杀、用戶編寫的其他程序或?qū)Τ绦蜻\(yùn)行有幫助的資源等。
Python 第三方庫的安裝
- 第三方庫需要安裝后才能使用崭孤。由于Python 語言經(jīng)歷了版本更迭過程类嗤,而且,第三方庫由全球開發(fā)者分布式維護(hù)辨宠,缺少統(tǒng)一的集中管理遗锣,因此,Python的第三方庫曾經(jīng)一度制約了Python 語言的普及和發(fā)展嗤形。隨著官方pip 工具的應(yīng)用精偿,Python 第三方庫的安裝變得十分容易。
- Python 第三方庫依照安裝方式靈活性和難易程度有三個(gè)方法,建議讀者依次使用还最,能夠?qū)⒌谌綆彀惭b成功墓阀,
- 這三個(gè)方法是:pip 工具安裝、自定義安裝和文件安裝拓轻。
pip 工具安裝
- 最常用且最高效的Python第三方庫安裝方式是采用pip工具安裝。
- pip是Python官方提供并維護(hù)的在線第三方庫安裝工具经伙。
- 對(duì)于同時(shí)安裝Python 2 和Python 3 環(huán)境的系統(tǒng)扶叉,建議采用pip3 命令專門為Python 3 版本安裝第三方庫。
- pip 是Python 內(nèi)置命令帕膜,需要通過命令行執(zhí)行枣氧,執(zhí)行pip -h 命令將列出pip 常用的子命令,注意垮刹,不要在IDLE 環(huán)境下運(yùn)行pip 程序达吞。
- pip 支持安裝(install)、下載(download)荒典、卸載(uninstall)酪劫、列表(list)、查看(list)寺董、查找(search)等一系列安裝和維護(hù)子命令覆糟。
- 安裝一個(gè)庫的命令格式如下,例如:
pip install <擬安裝庫名>
- 例如遮咖,安裝pygame 庫滩字,pip 工具默認(rèn)從網(wǎng)絡(luò)上下載pygame 庫安裝文件并自動(dòng)安裝到系統(tǒng)中。
pip install pygame
- 使用-U 標(biāo)簽可以更新已安裝庫的版本御吞,例如麦箍,用pip 更新本身:
pip install -U pip
- 卸載一個(gè)庫的命令格式如下,例如:
pip uninstall <擬卸載庫名>
- 可以通過list 子命令列出當(dāng)前系統(tǒng)中已經(jīng)安裝的第三方庫陶珠,例如:
pip list
- pip 是Python 第三方庫最主要的安裝方式挟裂,可以安裝超過90%以上的第三方庫。然而背率,由于一些歷史话瞧、技術(shù)和政策等原因,還有一些第三方庫無法暫時(shí)用pip 安裝寝姿,此時(shí)交排,需要其他的安裝方法
自定義安裝
文件安裝
對(duì)于上述三種安裝方式,一般優(yōu)先選擇采用pip 工具安裝饵筑,如果安裝失敗埃篓,則選擇自定義安裝或者文件安裝(Windows 平臺(tái))。另外根资,如果需要在沒有網(wǎng)絡(luò)條件下安裝Python 第三方庫架专,請(qǐng)直接采用文件安裝方式同窘。其中,.whl 文件可以通過pip download 指令在有網(wǎng)絡(luò)條件的情況下獲得部脚。
實(shí)例:pip 安裝腳本
這是一個(gè)用pip 安裝第三方庫的例子
pip 安裝腳本
- 實(shí)例16共需要安裝20個(gè)第三方Python 庫
- 需要注意想邦,庫名是第三方庫常用的名字,pip 安裝用的名字和庫名不一定完全相同委刘,建議采用小寫字符
- 安裝過程請(qǐng)?jiān)谙到y(tǒng)命令行下進(jìn)行丧没,不在IDLE 中,部分庫會(huì)依賴其他函數(shù)庫锡移,pip會(huì)自動(dòng)安裝呕童,部分庫下載后需要一個(gè)安裝過程,pip 也會(huì)自動(dòng)執(zhí)行淆珊。成功安裝庫后會(huì)出現(xiàn)” Successfully installed…”提示
pip 批量安裝Python 庫
如果讀者希望自動(dòng)安裝這些庫夺饲,可以使用Python 標(biāo)準(zhǔn)庫os 的system()函數(shù)調(diào)用控制臺(tái)。
下面給出采用pip 批量安裝Python 庫的方法施符。
#批量安裝Python庫的程序