官术网_书友最值得收藏!

前言
Preface

編程可以提高你解決復(fù)雜問(wèn)題的能力。現(xiàn)在的CPU運(yùn)算速度可達(dá)每秒數(shù)十億次,在其幫助下,我們可以快速、正確地找到難題的解決方案。

本書使用Python來(lái)解決工程問(wèn)題。我們將學(xué)習(xí)編碼幾何基元(作為實(shí)現(xiàn)其他復(fù)雜操作的基礎(chǔ))、讀寫文件、繪制矢量圖并制作動(dòng)畫來(lái)展示運(yùn)算結(jié)果,以及求解大型線性方程組。最后,我們將整合所有知識(shí),搭建一個(gè)用于求解桁架結(jié)構(gòu)問(wèn)題的應(yīng)用程序。

目標(biāo)讀者

本書針對(duì)的是工程專業(yè)的學(xué)生或已畢業(yè)的工程師,或者任何有專業(yè)背景、想通過(guò)學(xué)習(xí)編寫應(yīng)用程序來(lái)解決工程問(wèn)題的人。

讀者必須擁有數(shù)學(xué)和力學(xué)的專業(yè)背景。本書會(huì)涉及線性代數(shù)、平面二維幾何和物理學(xué)的相關(guān)概念,以及材料力學(xué)和數(shù)值方法的一些原理,這些是工程專業(yè)的常規(guī)課程。我們不會(huì)過(guò)多深入討論這些理論知識(shí),以照顧更多的讀者。同時(shí),在本書中學(xué)到的技巧可以用于解決涉及更復(fù)雜概念的問(wèn)題。

為了跟上本書的教學(xué),你還需要具備一些編程能力和Python基礎(chǔ)。本書不是編程入門教程,優(yōu)秀的編程入門教程已經(jīng)有很多,如果你想要這類書,我推薦Eric Matthes撰寫的Python Crash Course(No Starch出版社,2019年)。網(wǎng)絡(luò)上也有很多好資料,我最喜歡的網(wǎng)站的網(wǎng)址是https://realpython.com。Python的官方網(wǎng)站上也有很好的教程和文檔,網(wǎng)址是https://www.python.org/about/gettingstarted/。

我們會(huì)編寫很多代碼,因此我強(qiáng)烈建議你在學(xué)習(xí)本書時(shí),帶上一臺(tái)計(jì)算機(jī),用來(lái)編寫和測(cè)試本書中的所有代碼。

讀者收獲

在本書中,我們將學(xué)習(xí)優(yōu)秀程序的開發(fā)技巧,以正確、快速地解決工程問(wèn)題。我們將使用自動(dòng)化測(cè)試來(lái)測(cè)試代碼,以確保其正確。我們開發(fā)的每個(gè)應(yīng)用程序都應(yīng)該運(yùn)用自動(dòng)化測(cè)試來(lái)進(jìn)行有效測(cè)試,關(guān)于該測(cè)試方法的討論會(huì)貫穿全書。

工程應(yīng)用程序通常需要一些數(shù)據(jù)作為輸入,因此我們還將學(xué)習(xí)從文件中讀取數(shù)據(jù),以及使用正則表達(dá)式來(lái)解析數(shù)據(jù)的方法。

工程應(yīng)用程序通常需要求解大型方程組,因此我們將學(xué)習(xí)編寫數(shù)值算法的技巧來(lái)實(shí)現(xiàn)這些復(fù)雜的計(jì)算。我們會(huì)重點(diǎn)關(guān)注線性方程組,但該技巧可以輕易地應(yīng)用于編寫非線性方程組的數(shù)值算法。

最后,工程應(yīng)用程序需要輸出計(jì)算結(jié)果。我們將學(xué)習(xí)把數(shù)據(jù)寫入文件的方法,以便后續(xù)檢查。我們將學(xué)習(xí)繪制優(yōu)美的矢量圖和制作動(dòng)畫,以呈現(xiàn)程序運(yùn)算的結(jié)果。俗話說(shuō),一圖勝千言:一幅精心繪制的、展示最關(guān)鍵的計(jì)算結(jié)果的圖像可以賦予程序更大的價(jià)值。

為了展示以上所有概念,在本書末尾,我們將構(gòu)建一個(gè)求解二維桁架結(jié)構(gòu)的應(yīng)用程序。這個(gè)程序?qū)⒑w構(gòu)建工程應(yīng)用程序所需的一切知識(shí)。構(gòu)建該應(yīng)用程序所獲得的知識(shí)可以輕易地移植到其他類型的工程應(yīng)用程序編寫中。

關(guān)于本書

本部分主要包括三點(diǎn):本書英文書名的含義、選擇Python的原因和本書的章節(jié)列表。

“硬核”的含義

本書英文書名中的“Hardcore”(硬核)一詞是指我們將只使用Python標(biāo)準(zhǔn)庫(kù)(與Python一起分發(fā)的庫(kù))來(lái)編寫本書所有代碼,我們不會(huì)使用任何第三方庫(kù)來(lái)求解方程組或繪制矢量圖。

你可能會(huì)不理解,如果已經(jīng)有現(xiàn)成的代碼可以完成這些操作,為什么不直接使用呢?一定要重復(fù)造輪子[1]嗎?

本書是學(xué)習(xí)的指南,而學(xué)習(xí)必須要自己動(dòng)手。如果不重復(fù)造輪子,你將永遠(yuǎn)無(wú)法理解輪子。在你擁有了扎實(shí)的編程技能、編寫過(guò)幾千行代碼、完成許多項(xiàng)目后,你才能判斷哪些外部庫(kù)可以滿足需求,以及該如何利用它們。如果從一開始就使用外部庫(kù),你就會(huì)形成習(xí)慣,將其視作理所當(dāng)然。切記,在使用外部庫(kù)的時(shí)候,要經(jīng)常問(wèn)自己,它是如何解決問(wèn)題的。

和其他任何事情一樣,編程也是熟能生巧的。想成為優(yōu)秀的程序員,就必須編寫大量代碼,沒(méi)有捷徑可言。如果你只將編程作為賺錢的手段,或者只是想盡快將某個(gè)想法推到市場(chǎng)上,那就使用現(xiàn)有的庫(kù)吧。但如果你是為了學(xué)習(xí)并且希望熟練掌握編程的藝術(shù),那就不要使用外部庫(kù),要獨(dú)立編寫代碼。

為什么選擇Python

Python是最受喜愛(ài)的編程語(yǔ)言之一。根據(jù)Stack Overflow網(wǎng)站的2020年開發(fā)者調(diào)查報(bào)告(https://insights.stackoverflow.com/survey/2020),Python在“最受喜愛(ài)的編程語(yǔ)言”中排名第三,有66.7%的用戶愿意繼續(xù)使用它,僅次于TypeScript和Rust(見圖1)。

同樣是這份調(diào)查報(bào)告,在“最想學(xué)習(xí)的語(yǔ)言”排名中,Python排在第一位:在接受調(diào)查的、此前沒(méi)有使用過(guò)Python的開發(fā)者中,有30%表示有興趣學(xué)習(xí)Python(見圖2)。

這個(gè)結(jié)果并不令人驚訝,Python是一門極其通用且高效的編程語(yǔ)言。用Python編程非常輕松,而且它的標(biāo)準(zhǔn)庫(kù)非常完善:幾乎任何你想做的事情,Python都有現(xiàn)成的資源可以使用。

本書之所以選擇Python,不僅因?yàn)樗軞g迎,還因?yàn)樗子谑褂煤陀猛緩V泛。Python的一個(gè)優(yōu)點(diǎn)在于,即使你在閱讀本書前對(duì)它完全不了解,入門也不需要花太多時(shí)間。它相對(duì)易學(xué),互聯(lián)網(wǎng)上有各式各樣的教材和課程。

圖1 2020年最受喜愛(ài)的編程語(yǔ)言(來(lái)源:Stack Overflow網(wǎng)站調(diào)查報(bào)告)

圖2 2020年最想學(xué)習(xí)的編程語(yǔ)言(來(lái)源:Stack Overflow網(wǎng)站調(diào)查報(bào)告)

通常來(lái)說(shuō),Python不是一種“快速”的編程語(yǔ)言。的確,執(zhí)行速度不是Python的長(zhǎng)項(xiàng)。圖3展示了用Python和Go(谷歌開發(fā)的一種快速編程語(yǔ)言)編寫的三個(gè)相同程序的執(zhí)行時(shí)間(單位為秒)。Python執(zhí)行每一個(gè)程序的時(shí)間都比Go長(zhǎng)很多。

圖3 Python對(duì)標(biāo)測(cè)試(來(lái)源:https://benchmarksgame-teampages.debian.net/benchmarksgame/fastest/python3-go.html)

那么,難道我們不在乎速度嗎?當(dāng)然在乎,但對(duì)于本書的目的而言,開發(fā)時(shí)間和開發(fā)經(jīng)驗(yàn)更加關(guān)鍵。Python有很多代碼結(jié)構(gòu),可以使編程變得輕松。例如,對(duì)集合的過(guò)濾或映射等操作,Python的列表推導(dǎo)式可以一步到位,而Go則需要用到“古老”的for循環(huán)。我們將要編寫的所有程序基本都不用顧慮執(zhí)行時(shí)間,我們會(huì)得到超預(yù)期的結(jié)果。如果你在其他應(yīng)用程序中遇到速度問(wèn)題,那么在本書中學(xué)習(xí)到的技巧也可以應(yīng)用到其他更快的編程語(yǔ)言中。

在開始學(xué)習(xí)之前,先快速預(yù)覽本書的主要內(nèi)容。

內(nèi)容概覽

本書的內(nèi)容非常豐富。每一章都建立在之前的章節(jié)基礎(chǔ)之上,因此請(qǐng)確保按順序閱讀本書,并練習(xí)每一章的代碼。

本書包括以下內(nèi)容:

第一部分:基礎(chǔ)知識(shí)

第1章主要介紹Python的一些中級(jí)概念,這些概念會(huì)貫穿全書。我會(huì)介紹如何將代碼拆分成模塊和包的形式、如何使用Python的集合,以及如何運(yùn)行Python腳本和導(dǎo)入模塊等。

第2章介紹函數(shù)式編程和面向?qū)ο缶幊踢@兩種范式,探討對(duì)應(yīng)的代碼編寫技巧。

第3章介紹如何使用命令行來(lái)運(yùn)行程序,以及執(zhí)行一些簡(jiǎn)單任務(wù),如創(chuàng)建文件。

第二部分:二維幾何

第4章介紹最基礎(chǔ)但至關(guān)重要的幾何基元:點(diǎn)和向量。本書的其余部分都依賴這兩個(gè)基元的應(yīng)用。同時(shí),我們還將學(xué)習(xí)自動(dòng)化測(cè)試方法,以確保代碼沒(méi)有錯(cuò)誤。

第5章將直線和線段這兩個(gè)幾何基元加入我們的幾何工具箱中。我們將學(xué)習(xí)如何檢查兩條線段或直線是否相交,如何計(jì)算交點(diǎn)。

第6章將矩形、圓和多邊形添加到我們的幾何工具箱中。

第7章講解仿射變換這一有趣的代數(shù)構(gòu)造,我們將用其來(lái)制作漂亮的圖片和動(dòng)畫。

第三部分:圖形和模擬

第8章介紹可縮放矢量圖形(SVG)格式。我們將編寫自己的庫(kù),使用幾何基元來(lái)生成這類圖形。

第9章利用前面章節(jié)學(xué)到的所有知識(shí),搭建我們的第一個(gè)應(yīng)用程序,該程序會(huì)計(jì)算出經(jīng)過(guò)三個(gè)指定點(diǎn)的圓,并將結(jié)果繪制成矢量圖。

第10章介紹Tkinter包的基礎(chǔ)知識(shí),該包用于在Python中創(chuàng)建用戶界面。我們將主要學(xué)習(xí)如何使用畫布小部件,以在屏幕上繪制圖像。

第11章學(xué)習(xí)如何通過(guò)在Tkinter的畫布中繪圖來(lái)創(chuàng)建動(dòng)畫。我們將探討時(shí)間循環(huán),這一概念被用于工程仿真和視頻游戲引擎中來(lái)將場(chǎng)景渲染到屏幕上。

第12章創(chuàng)建一個(gè)應(yīng)用程序,將對(duì)一些幾何基元應(yīng)用仿射變換的效果制作成動(dòng)畫。

第四部分:方程組

第13章介紹矩陣和向量的構(gòu)造,并介紹如何編碼這兩個(gè)基元,這在我們處理方程組時(shí)會(huì)非常有用。

第14章介紹使用數(shù)值方法求解大型線性方程組的方法。我們會(huì)對(duì)Cholesky因式分解算法進(jìn)行編碼,該算法在第五部分的方程組求解中還會(huì)用到。

第五部分:桁架結(jié)構(gòu)

第15章講解本部分會(huì)涉及的材料力學(xué)的一些基本概念。我們會(huì)編寫一些類來(lái)代表一個(gè)桁架結(jié)構(gòu)模型,然后用這個(gè)模型建立一個(gè)完整的結(jié)構(gòu)分析應(yīng)用程序。

第16章使用上一章建立的模型,學(xué)習(xí)求解結(jié)構(gòu)位移、變形和應(yīng)力所需的所有計(jì)算方法。

第17章介紹讀取和解析文件的方法,使得我們的桁架分析應(yīng)用程序能夠讀取以文本文檔形式存儲(chǔ)的數(shù)據(jù)。

第18章介紹用結(jié)構(gòu)計(jì)算結(jié)果生成SVG圖像的算法。我們將使用自己編寫的SVG包來(lái)繪制圖形,這個(gè)圖形會(huì)包含所有相關(guān)的細(xì)節(jié),如結(jié)構(gòu)變形后的幾何形狀和每個(gè)桿旁邊的應(yīng)力標(biāo)簽。

第19章學(xué)習(xí)如何將前面章節(jié)中編寫的代碼組合到一起,構(gòu)建完整的桁架分析程序。

搭建開發(fā)環(huán)境

本書使用Python3和PyCharm軟件,并會(huì)提供PyCharm的操作指導(dǎo)。PyCharm是一個(gè)開發(fā)環(huán)境軟件,可以提高編程效率。書中的代碼已經(jīng)經(jīng)過(guò)Python 3.6到3.9版本的測(cè)試,對(duì)于更新的版本,大概率也可以很好地運(yùn)行。請(qǐng)下載本書附帶的代碼,安裝最新的Python3解釋器,并安裝PyCharm軟件。

下載本書代碼

GitHub網(wǎng)站上有本書所有代碼,鏈接為https://github.com/angelsolaorbaiceta/Mechanics。雖然我強(qiáng)烈建議你手動(dòng)編寫所有代碼,但也不妨將其作為參考。

如果你熟悉Git版本控制系統(tǒng)和GitHub網(wǎng)站,那么你可能會(huì)克隆該倉(cāng)庫(kù)。我建議你定期拉取該倉(cāng)庫(kù),因?yàn)槲遗紶柨赡軙?huì)添加新特性或修復(fù)錯(cuò)誤代碼。

如果你不熟悉Git或GitHub,那么最好的選擇是下載一份代碼副本。單擊Clone(克隆)按鈕并選擇Download ZIP(下載ZIP)選項(xiàng)即可(見圖4)。

解壓縮該項(xiàng)目,并將其放在某個(gè)目錄中。你會(huì)發(fā)現(xiàn),我用README文件(README.md)記錄了該項(xiàng)目的每個(gè)包和子包。這些文件經(jīng)常出現(xiàn)在軟件項(xiàng)目中,它們負(fù)責(zé)解釋和記錄項(xiàng)目的特性,也包含編譯或運(yùn)行代碼的指導(dǎo)。當(dāng)打開一個(gè)軟件項(xiàng)目時(shí),你應(yīng)該首先閱讀README文件,因?yàn)樗枋隽伺渲庙?xiàng)目和運(yùn)行代碼的方法。

圖4 從GitHub網(wǎng)站下載代碼

注意 README文件使用Markdown格式編寫。如果想對(duì)該格式有更多了解,可以訪問(wèn)網(wǎng)址https://www.markdownguide.org/。

GitHub上的Mechanics項(xiàng)目所包含的代碼比本書中涉及的要多。我不想把這本書寫得太長(zhǎng),因此沒(méi)有涵蓋該項(xiàng)目的所有內(nèi)容。

例如,在第14章中,我們將探討線性方程組求解的數(shù)值方法,并詳細(xì)解釋楚列斯基(Cholesky)分解法。其他數(shù)值方法,如共軛梯度法(conjugate gradient),我們?cè)跁袩o(wú)法一一討論,但是該項(xiàng)目中有對(duì)應(yīng)的代碼,可以供你分析和運(yùn)用。為了簡(jiǎn)潔起見,我們?cè)跁幸彩÷粤嗽S多自動(dòng)測(cè)試代碼,當(dāng)你編寫測(cè)試代碼時(shí),可以參考項(xiàng)目中的代碼。

現(xiàn)在是時(shí)候安裝Python了。

安裝Python

從鏈接https://www.python.org/downloads/可以下載macOS、Linux和Windows操作系統(tǒng)對(duì)應(yīng)的Python版本。Windows和macOS操作系統(tǒng)需要下載安裝程序并運(yùn)行。

Linux操作系統(tǒng)通常預(yù)裝Python。你可以在shell中使用以下命令查看計(jì)算機(jī)上安裝的Python版本:

在Linux計(jì)算機(jī)上安裝Python的特定版本,需要用到os包管理器(os package manager)。對(duì)于使用apt包管理器的Ubuntu系統(tǒng)用戶,命令如下:

對(duì)于使用dnf包管理器的Fedora系統(tǒng)用戶,命令如下:

如果你使用的是Linux的其他發(fā)行版本,用谷歌搜索可以找到對(duì)應(yīng)的包管理器的Python安裝教程。

關(guān)鍵是下載Python3版本,如3.9版,這是本書編寫時(shí)的最新版本。3.6及以上的版本都可以。

注意 Python2和Python3不兼容;用Python3編寫的代碼大概率無(wú)法在Python2的解釋器上運(yùn)行。Python的升級(jí)是非向后兼容的,因此Python3中的一些特性在Python2中不存在。

安裝和配置PyCharm軟件

開發(fā)代碼時(shí),我們通常會(huì)使用集成開發(fā)環(huán)境軟件(Integrated Development Environment,IDE),它擁有很多功能,能提高我們的編程效率。IDE通常具有自動(dòng)補(bǔ)全功能,讓你在輸入時(shí)知道有哪些備選項(xiàng),構(gòu)建、調(diào)試和測(cè)試工具時(shí)也一樣。花一點(diǎn)時(shí)間學(xué)習(xí)IDE的主要功能是值得的,它將使你在開發(fā)階段更高效。

本書使用PyCharm軟件,它是由JetBrains公司創(chuàng)建的功能強(qiáng)大的IDE,該公司不僅擁有市場(chǎng)上最好的IDE軟件,還擁有自己的編程語(yǔ)言:Kotlin。如果你已經(jīng)擁有一些Python編程經(jīng)驗(yàn),并且更喜歡使用其他IDE(如Visual Studio Code),倒也無(wú)妨,只是在碰到問(wèn)題時(shí),你需要自己查閱IDE文檔來(lái)解決問(wèn)題。如果你沒(méi)有太多的IDE使用經(jīng)驗(yàn),我建議使用PyCharm,這樣你就可以緊隨本書課程。

要下載PyCharm軟件,請(qǐng)打開鏈接https://www.jetbrains.com/pycharm/,單擊DOWNLOAD(下載)按鈕(見圖5)。

PyCharm有Linux、macOS和Windows版本。每個(gè)版本又有兩種類型:專業(yè)版和社區(qū)版。你可以下載免費(fèi)的社區(qū)版,然后在計(jì)算機(jī)上按照步驟安裝PyCharm。

打開Mechanics項(xiàng)目文件

圖5 下載PyCharm IDE軟件

讓我們用PyCharm軟件來(lái)設(shè)置之前下載的Mechanics項(xiàng)目,這樣就可以使用它并將其代碼作為參考。

打開PyCharm,然后單擊歡迎界面的“打開”(Open)選項(xiàng),找到你在GitHub下載或克隆的Mechanics項(xiàng)目文件夾并選中它。PyCharm會(huì)打開該項(xiàng)目,并使用計(jì)算機(jī)中安裝的Python版本為其配置Python解釋器。

PyCharm中的每個(gè)項(xiàng)目都需要設(shè)置對(duì)應(yīng)的Python解釋器。因?yàn)橛?jì)算機(jī)可能安裝了不同版本的Python,安裝位置也可能不同,所以你需要告訴PyCharm,你想使用哪一個(gè)Python版本來(lái)解釋項(xiàng)目代碼,以及該解釋器在什么路徑。對(duì)于Windows和Linux系統(tǒng)用戶,請(qǐng)?jiān)诓藛螜谶x擇File(文件)→Settings(設(shè)置)。對(duì)于macOS用戶,請(qǐng)選擇PyCharm→Preferences(首選項(xiàng))。在Settings/Preferences(設(shè)置/首選項(xiàng))窗口中,單擊左側(cè)的Project:Mechanics來(lái)展開項(xiàng)目,并選擇相應(yīng)的Python解釋器(見圖6)。

圖6 設(shè)置項(xiàng)目的Python解釋器

在窗口的右側(cè),單擊Python解釋器一行最右側(cè)的下拉箭頭,在下拉窗口中,選擇對(duì)應(yīng)的Python版本。如果你遵循前面的教程,Python會(huì)安裝到默認(rèn)目錄中,PyCharm可以直接找到它,因此對(duì)應(yīng)的解釋器也應(yīng)該出現(xiàn)在列表中。如果你將Python安裝到了其他位置,則需要告訴PyCharm具體的文件夾位置。

注意 如果在設(shè)置項(xiàng)目解釋器時(shí)遇到問(wèn)題,請(qǐng)查看PyCharm的官方文檔:https://www.jetbrains.com/help/pycharm/configuring-python-interpreter.html(此鏈接包含該操作的詳細(xì)說(shuō)明)。

再次打開Mechanics項(xiàng)目,它應(yīng)該已經(jīng)設(shè)置好了。雙擊README.md文件,在PyCharm中打開它。在PyCharm中打開Markdown文件,會(huì)默認(rèn)顯示一個(gè)分割視圖:左側(cè)是Markdown的源文件,右側(cè)是該文件的渲染版本,見圖7。

圖7 README文件在PyCharm中的分割視圖

這份README.md文件闡述了項(xiàng)目的基本結(jié)構(gòu)。請(qǐng)隨意瀏覽預(yù)覽中鏈接的內(nèi)容,花一些時(shí)間閱讀每個(gè)軟件包的README文件。這將讓你更好地了解我們將要完成的工作量。

創(chuàng)建單獨(dú)的Mechanics項(xiàng)目

下載的Mechanics項(xiàng)目已經(jīng)設(shè)置完成,讓我們創(chuàng)建一個(gè)新項(xiàng)目,用于編寫自己的代碼。如果項(xiàng)目已打開,請(qǐng)先將其關(guān)閉[選擇File(文件)→Close Project(關(guān)閉項(xiàng)目)],然后你會(huì)看到歡迎界面,見圖8。

單擊歡迎界面的Create New Project(新建項(xiàng)目),在位置一欄中輸入項(xiàng)目名稱:Mechanics。然后,選擇解釋器部分,忽略默認(rèn)的New environment using(使用此工具新建環(huán)境),選擇Existing interpreter(先前配置的解釋器),見圖9。找到之前下載的Python版本,然后單擊CREATE(創(chuàng)建)按鈕。

圖8 PyCharm的歡迎界面

圖9 創(chuàng)建一個(gè)新項(xiàng)目

至此,一個(gè)新項(xiàng)目就創(chuàng)建好,可以編寫代碼了。讓我們先快速學(xué)習(xí)一下PyCharm的主要功能。

PyCharm介紹

這里并沒(méi)有給出PyCharm的詳細(xì)指南。要獲得對(duì)該IDE的更完整概述,請(qǐng)閱讀官方文檔https://www.jetbrains.com/help/pycharm。該官方文檔不僅全面,而且會(huì)實(shí)時(shí)更新最新的特性。

PyCharm功能強(qiáng)大,它的社區(qū)(免費(fèi))版包含許多功能,這也使得Python編程變得令人愉快。它的用戶界面(UI)主要分為四個(gè)部分(見圖10)。

圖10 PyCharm的用戶界面

導(dǎo)航欄:窗口的頂部是導(dǎo)航欄。其左側(cè)是當(dāng)前文件的路徑導(dǎo)航(又叫面包屑導(dǎo)航),右側(cè)是程序運(yùn)行和調(diào)試按鈕,以及顯示當(dāng)前運(yùn)行配置的下拉列表(后面會(huì)介紹運(yùn)行配置)。

項(xiàng)目工具窗口:顯示項(xiàng)目的目錄結(jié)構(gòu),包括所有包和文件。

編輯器:用于編寫代碼。

終端:PyCharm擁有兩個(gè)終端,即計(jì)算機(jī)系統(tǒng)終端和Python終端。兩者在本書中都會(huì)經(jīng)常使用。我們將在第3章中講解這些內(nèi)容。

用戶界面的右下角還會(huì)顯示項(xiàng)目對(duì)應(yīng)的Python解釋器。你可以在這里更改解釋器版本,從系統(tǒng)上安裝的版本列表中選擇即可。

創(chuàng)建包和文件

我們可以在項(xiàng)目工具窗口中創(chuàng)建新的Python項(xiàng)目包(我們將在第1章中介紹包的知識(shí))。要?jiǎng)?chuàng)建新包,請(qǐng)?jiān)陧?xiàng)目工具窗口中,右擊要?jiǎng)?chuàng)建新包的文件夾或包,在出現(xiàn)的菜單中選擇New(新建)→Python Package(Python包)。同樣,創(chuàng)建Python文件可以選擇New→Python File(Python文件)。圖11中顯示了這些選項(xiàng)。

還可以選擇New→Directory(目錄)以創(chuàng)建常規(guī)目錄,選擇New→File(文件),選中對(duì)應(yīng)文件的擴(kuò)展名,即可創(chuàng)建任意類型的文件。常規(guī)目錄和Python包的區(qū)別在于,后者包含一個(gè)名為__init__.py的文件,該文件會(huì)指示Python解釋器將其所在的目錄視作一個(gè)具有Python代碼的包。你可以在第1章中了解更多相關(guān)信息。

圖11 PyCharm創(chuàng)建新的包或文件

創(chuàng)建運(yùn)行配置

運(yùn)行配置(run configuration)用于告訴PyCharm項(xiàng)目(或它的某部分)應(yīng)該如何運(yùn)行。我們可以保存配置,以便根據(jù)需要重復(fù)使用。有了運(yùn)行配置,我們只用一個(gè)按鈕就能執(zhí)行應(yīng)用程序,而不需要在shell中編寫繁雜的命令,如復(fù)制/粘貼參數(shù)、輸入文件名稱等。

另外,運(yùn)行配置可以包括其他信息,如應(yīng)用程序的入口點(diǎn)、標(biāo)準(zhǔn)輸入的重定向文件、必須設(shè)置的環(huán)境變量以及傳遞給程序的參數(shù)等。運(yùn)行配置非常方便,可以節(jié)省開發(fā)時(shí)間;它還可以讓我們輕松地調(diào)試Python代碼,下文會(huì)介紹這一點(diǎn)。你可以通過(guò)如下路徑獲取運(yùn)行配置的官方文檔:https://www.jetbrains.com/help/pycharm/run-debug-configuration.html。

讓我們動(dòng)手創(chuàng)建一個(gè)運(yùn)行配置吧。為此,首先需要?jiǎng)?chuàng)建一個(gè)新項(xiàng)目。

創(chuàng)建一個(gè)測(cè)試項(xiàng)目

在菜單欄中新建項(xiàng)目,請(qǐng)選擇File→New Project(新建項(xiàng)目)。在Create Project(創(chuàng)建項(xiàng)目)對(duì)話框中,輸入“RunConfig”作為項(xiàng)目名稱,選擇Existing interpreter,然后單擊CREATE。

在這個(gè)新項(xiàng)目中,右擊項(xiàng)目工具窗口中的RunConfig目錄,然后選擇New→Python File以創(chuàng)建一個(gè)Python文件,將其命名為“fibonacci”。打開該文件,輸入以下代碼:

這是一個(gè)用遞歸算法計(jì)算第n個(gè)斐波那契數(shù)的函數(shù),我們用它來(lái)計(jì)算和輸出第30個(gè)斐波那契數(shù)。讓我們創(chuàng)建一個(gè)新的運(yùn)行配置來(lái)執(zhí)行此腳本。

創(chuàng)建一個(gè)新的運(yùn)行配置

若要?jiǎng)?chuàng)建新的運(yùn)行配置,請(qǐng)?jiān)诓藛螜谥羞x擇Run(運(yùn)行)→Edit Configurations(編輯配置),從而彈出如圖12所示的對(duì)話框。

圖12 “運(yùn)行/調(diào)試配置”對(duì)話框

如圖12所示,我們可以使用模板來(lái)創(chuàng)建一個(gè)新的運(yùn)行配置。每個(gè)模板都定義了一些參數(shù),可以幫助我們輕松地創(chuàng)建正確的配置。在這本書中,我們只會(huì)使用Python模板。該模板定義了一個(gè)用來(lái)運(yùn)行和調(diào)試Python文件的運(yùn)行配置。

在對(duì)話框中,單擊左上角的“+”按鈕,并從彈出的模板列表中選擇Python(見圖13)。

圖13 創(chuàng)建一個(gè)新的Python運(yùn)行配置

選擇配置模板后,對(duì)話框的右側(cè)會(huì)顯示我們需要為運(yùn)行配置代碼提供的參數(shù)。我們只需填寫兩個(gè)參數(shù):配置名稱和腳本路徑。

找到對(duì)話框頂部的Name(名稱)字段,輸入“fibonacci”,然后在Configuration(配置)部分找到腳本路徑字段,單擊其右側(cè)的文件夾圖標(biāo)。單擊圖標(biāo)后,會(huì)打開一個(gè)選擇腳本對(duì)話框,路徑指向項(xiàng)目的根文件夾,這也是我們添加fibonacci.py文件的位置。選擇此文件作為腳本路徑。最終的配置對(duì)話框如圖14所示。單擊OK(確定)按鈕。

圖14 運(yùn)行配置參數(shù)設(shè)置

你已經(jīng)成功地創(chuàng)建了一個(gè)運(yùn)行配置,讓我們運(yùn)行它吧。

使用運(yùn)行配置

在導(dǎo)航欄的右側(cè),找到運(yùn)行配置選擇器,如圖15所示。

圖15 運(yùn)行配置選擇器

在下拉列表中,選擇剛才創(chuàng)建的運(yùn)行配置,單擊綠色運(yùn)行按鈕來(lái)執(zhí)行它。IDE的shell中應(yīng)該會(huì)顯示如下信息:

還可以通過(guò)在菜單中選擇Run→Run fibonacci(運(yùn)行fibonacci)來(lái)啟動(dòng)運(yùn)行配置。

我們已經(jīng)使用運(yùn)行配置成功地執(zhí)行了fibonacci.py腳本。現(xiàn)在讓我們學(xué)習(xí)如何使用它調(diào)試Python代碼。

調(diào)試Python代碼

當(dāng)程序運(yùn)行不正常且原因不明時(shí),需要對(duì)其進(jìn)行調(diào)試。要調(diào)試程序,我們可以一次一步,逐行執(zhí)行該程序,檢查變量值。

在調(diào)試腳本之前,先對(duì)fibonacci函數(shù)小改一下。假設(shè)使用這個(gè)函數(shù)的人抱怨它計(jì)算大數(shù)時(shí)速度太慢,例如,函數(shù)計(jì)算第50個(gè)斐波那契數(shù)需要好幾分鐘:

經(jīng)過(guò)仔細(xì)分析,我們意識(shí)到,如果我們對(duì)已經(jīng)計(jì)算出的斐波那契數(shù)進(jìn)行存儲(chǔ),避免一次又一次地重復(fù)計(jì)算,那么我們的fibonacci函數(shù)就可以得到改進(jìn)。為了加快執(zhí)行速度,我們決定將已經(jīng)計(jì)算出的斐波那契數(shù)保存到一個(gè)字典中。代碼修改如下:

在開始調(diào)試練習(xí)之前,請(qǐng)?jiān)俅芜\(yùn)行該腳本,以確保其仍能產(chǎn)生預(yù)期結(jié)果。你可以更進(jìn)一步,嘗試計(jì)算第50個(gè)斐波那契數(shù)。這一次計(jì)算時(shí)間將是毫秒級(jí)。命令如下:

產(chǎn)生的結(jié)果如下:

現(xiàn)在讓我們?cè)谡{(diào)用函數(shù)的那一行停止執(zhí)行:

要做到這一點(diǎn),我們需要在Python解釋器停止執(zhí)行的那一行設(shè)置斷點(diǎn)(breakpoint)。設(shè)置斷點(diǎn)有兩種方式:一是在編輯器區(qū)域你想要停止的行的右側(cè)單擊(如圖16中顯示的點(diǎn)處);二是單擊該行的任意位置,然后從菜單中選擇Run→Toggle Breakpoints(切換斷點(diǎn))→Line Breakpoint(行斷點(diǎn))。

如果添加斷點(diǎn)成功,你應(yīng)該看到類似圖16所示的一個(gè)圓點(diǎn)。

要想在調(diào)試模式下啟動(dòng)Fibonacci運(yùn)行配置,需要單擊紅色的調(diào)試按鈕,而不是綠色的運(yùn)行按鈕(見圖15),或在菜單欄選擇Run→Debug fibonacci(調(diào)試fibonacci)。

PyCharm會(huì)執(zhí)行腳本并檢查斷點(diǎn),一旦發(fā)現(xiàn)斷點(diǎn),它就會(huì)在這一行之前停止執(zhí)行。你的IDE應(yīng)該在設(shè)置斷點(diǎn)的行上停止執(zhí)行,并在下方顯示調(diào)試控件,如圖17所示。

圖16 在代碼中設(shè)置斷點(diǎn)

圖17 PyCharm的調(diào)試器

在調(diào)試器的頂部附近有一欄,用來(lái)控制程序的執(zhí)行(見圖18)。該欄上有一些圖標(biāo),我們主要關(guān)注的是前兩個(gè):步過(guò)(step over)和步入(step into)。使用“步過(guò)”選項(xiàng),我們可以執(zhí)行當(dāng)前行并跳轉(zhuǎn)到下一行。“步入”選項(xiàng)則會(huì)進(jìn)入當(dāng)前行的函數(shù)內(nèi)部。我們稍后會(huì)講解這兩個(gè)選項(xiàng)。

圖18 調(diào)試器的執(zhí)行控件

調(diào)試器的右側(cè)有一個(gè)變量窗格,我們可以在這里檢查程序的當(dāng)前狀態(tài):所有變量的值。例如,在圖17中可以看到cache變量,它是一個(gè)空字典。

現(xiàn)在,讓我們單擊調(diào)試器執(zhí)行控件中的“步入”圖標(biāo),執(zhí)行進(jìn)入fibonacci函數(shù)內(nèi)部,并停在第一行指令上(見圖19)。

圖19 步入fibonacci函數(shù)

調(diào)試器的變量窗格顯示變量n當(dāng)前值為50。這個(gè)值也出現(xiàn)在fibonacci函數(shù)定義的旁邊,如圖19所示(這兩個(gè)位置都用箭頭表示)。

調(diào)試器的左側(cè)是“框架”窗格。這個(gè)窗格展示了程序的棧幀。每當(dāng)函數(shù)執(zhí)行時(shí),一個(gè)帶有函數(shù)局部變量和其他信息的新幀就會(huì)被壓入該棧。你可以來(lái)回單擊幀來(lái)檢查程序在調(diào)用函數(shù)之前的狀態(tài)。例如,你可以單擊<module>,fibonacci.py:15棧幀,查看調(diào)用fibonacci函數(shù)之前的狀態(tài)。要返回當(dāng)前執(zhí)行點(diǎn),只需單擊最頂部的棧幀,本例中是fibonacci,fibonacci.py:5。

嘗試?yán)^續(xù)使用步過(guò)和步入控件來(lái)調(diào)試程序,觀察cache變量和n的值如何改變。實(shí)驗(yàn)結(jié)束后,為了停止調(diào)試,你可以執(zhí)行程序中的所有指令,直到結(jié)束,或者單擊調(diào)試器中的停止按鈕。你可以從菜單中選擇Run→Stop fibonacci(停止fibonacci)來(lái)執(zhí)行此操作或單擊調(diào)試器左側(cè)的紅色正方形圖標(biāo)。

讓我們最后嘗試一次調(diào)試練習(xí)。在調(diào)試模式下再次運(yùn)行程序,當(dāng)執(zhí)行到斷點(diǎn)處停止時(shí),單擊“步過(guò)”圖標(biāo)。在變量窗格中檢查變量cache。如你所見,cache現(xiàn)在被從3到50的斐波納契數(shù)填滿了。你可以展開字典以檢查其內(nèi)部的所有值,如圖20所示。

你還可以使用調(diào)試器的控制臺(tái)與當(dāng)前的程序進(jìn)行交互(見圖21)。在調(diào)試器視圖中,單擊Debugger選項(xiàng)卡旁邊的Console(控制臺(tái))選項(xiàng)卡。在控制臺(tái)中,你可以檢查當(dāng)前程序的狀態(tài),執(zhí)行某些操作,如檢查某個(gè)斐波那契數(shù)是否被緩存:

圖20 調(diào)試器中的變量

圖21 調(diào)試器的控制臺(tái)

小結(jié)

在前言中,我們預(yù)覽了本書的內(nèi)容,了解了學(xué)習(xí)本書并充分利用它所需的先決條件。我們還安裝了Python,配置了開發(fā)環(huán)境,使其能夠有效地運(yùn)行。

最后一部分,我們預(yù)覽了PyCharm及其強(qiáng)大的調(diào)試工具,不過(guò)你可能已經(jīng)意識(shí)到,我們的了解非常有限。想了解更多關(guān)于PyCharm調(diào)試的知識(shí),請(qǐng)查看官方文檔https://www.jetbrains.com/help/pycharm/debugging-code.html。

現(xiàn)在,讓我們開始學(xué)習(xí)Python吧。


[1]重復(fù)造輪子,是指重復(fù)創(chuàng)造已經(jīng)存在的方法,多用于軟件開發(fā)領(lǐng)域。——譯者注

主站蜘蛛池模板: 子洲县| 松桃| 栾川县| 宽城| 专栏| 东丽区| 塔城市| 高陵县| 泉州市| 彩票| 尉犁县| 仙游县| 株洲县| 三台县| 体育| 铜陵市| 平原县| 梁山县| 梁平县| 普兰店市| 中宁县| 繁昌县| 会理县| 昂仁县| 徐州市| 壤塘县| 阿克陶县| 宁夏| 楚雄市| 平顺县| 广南县| 洞口县| 巫山县| 吉首市| 堆龙德庆县| 英吉沙县| 宁阳县| 彰化市| 登封市| 临漳县| 大冶市|