編寫Python代碼多種工具介紹

      網(wǎng)友投稿 814 2022-05-30

      前言

      Python is getting more attention than usual this year, becoming one of the most popular programming languages in the world.

      -- by Krzyszt

      對于技術(shù)類文章,我一般都會(huì)聯(lián)想到一些高大上的描述,或是一些人文故事。但是,對于Python這樣的全民化編程語言,我覺得上面這句來自Krzyszt的口語化描述,就足夠了。

      Python是一種跨平臺的編程語言,這就意味著它能夠在所有主要的操作系統(tǒng)上,在所有安裝了Python的現(xiàn)代計(jì)算機(jī)上,運(yùn)行你編寫的任何Python程序。今天文章里要給大家具體講講幾款常見的工具,包括了Python自帶的解釋器、文本編輯器(Geany、Sublime Text)、主流IDE(PyCharm、Jupyter Notebook),以及如何使用公有云的計(jì)算資源在本地開發(fā)。

      正文

      Python自帶的解釋器

      Python自帶了一個(gè)在終端窗口中運(yùn)行的解釋器,你無需保存代碼,支持直接運(yùn)行整個(gè)程序,如下所示:

      Geany

      Geany是一款簡單的文本編輯器,安裝很容易,支持直接運(yùn)行幾乎所有的程序(不需要通過終端運(yùn)行),支持使用顏色區(qū)分關(guān)鍵代碼,突出代碼語法。

      編寫Python代碼的多種工具介紹

      我們可以在官網(wǎng)下載Geany軟件:https://geany.org/。

      安裝完成后,首先在本地創(chuàng)建一個(gè)文件夾用于保存和運(yùn)行代碼,例如python_work文件夾。

      創(chuàng)建一個(gè)新文件,并且通過“SAVE AS”保存到pytthon_word文件夾。

      如果你已經(jīng)安裝了python,也就是說,如果能在系統(tǒng)中執(zhí)行命令python,就無需配置Geany,如果不能執(zhí)行順利執(zhí)行python命令就需要對Geany進(jìn)行配置。

      涉及到編碼代碼和運(yùn)行代碼的是“生成”按鈕,如下圖所示:

      先來執(zhí)行一個(gè)helloWolrld命令,如下圖所示:

      進(jìn)一步解釋“生成”下拉框所列的功能,我采用的是“阿姆斯特朗數(shù)”,即如果一個(gè)n位正整數(shù)等于其各位數(shù)字的n次方之和,則稱該數(shù)為阿姆斯特朗數(shù)。 例如1^3 + 5^3 + 3^3 = 153。

      代碼如下:

      # take input from the user

      num = int(input("Enter a number: "))

      # initialize sum

      sum = 0

      # find the sum of the cube of each digit

      temp = num

      while temp > 0:

      digit = temp % 10

      sum += digit ** 3

      temp //= 10

      # display the result

      if num == sum:

      print(num,"is an Armstrong number")

      else:

      print(num,"is not an Armstrong number")

      “Compile”:編譯代碼,類似于執(zhí)行了python -m py_compile helloWorld.py,生成.pyc文件。pyc是一種二進(jìn)制文件,是由py文件經(jīng)過編譯后生成的文件,屬于byte code。py文件變成pyc文件后,加載的速度有所提高,而且pyc是一種跨平臺的字節(jié)碼,是由python的虛擬機(jī)來執(zhí)行的,這個(gè)是類似于JAVA或者.NET的虛擬機(jī)的概念。pyc的內(nèi)容和python的版本相關(guān),不同版本編譯后的pyc文件不完全相同,例如v2.5編譯的pyc文件在v2.4版本的 python上是無法執(zhí)行的。

      “Lint”:這個(gè)功能會(huì)對代碼做靜態(tài)檢測,例如制表符、空格、變量命名等等是否符合要求,本案例中部分行只縮進(jìn)了3個(gè)空格,第18行的“num,”后面缺少空格,報(bào)錯(cuò)如下所示:

      代碼改動(dòng)完畢后就顯示編譯正常,如下圖所示:

      “生成目標(biāo)文件”:運(yùn)行”make current_file.o” 文件,好處是只會(huì)編譯當(dāng)前指定的文件,而不是整個(gè)項(xiàng)目。

      “Execute”:實(shí)際上調(diào)用Python的終端編譯器,如下圖所示:

      Geany的操作界面和編譯器支持個(gè)性化配置,這里不逐一展開,你可以自己通過“編輯”-“首選項(xiàng)”嘗試。

      Sublime Text

      和Geany類似,Sublime Text是一款簡單的文本編輯器,能夠直接運(yùn)行幾乎所有程序(無需通過終端),支持使用不同的顏色顯示關(guān)鍵代碼,突出代碼語法。

      Sublime Text的優(yōu)點(diǎn):

      l? 跨平臺: Sublime Text為跨平臺編輯器(在Linux、OS X和Windows下均可使用)。作為一個(gè)程序員,切換系統(tǒng)是常有的事情,為了減少重復(fù)學(xué)習(xí),使用一個(gè)跨平臺的編輯器是很有必要的;

      l? 可擴(kuò)展: Sublime Text是可擴(kuò)展的(Extensible),并包含大量實(shí)用插件,我們可以通過安裝自己領(lǐng)域的插件來成倍提高工作效率;

      l? 互補(bǔ): Sublime Text是命令行環(huán)境(CLI)和圖形界面環(huán)境(GUI)下的最佳選擇,同時(shí)使用兩者會(huì)大大提高工作效率。

      從使用的角度看,Sublime Text真的是針對程序員的工具,舉一個(gè)例子,它的所有設(shè)置都是通過JSON配置文件完成的,支持你自己寫配置文件的方式,感覺很好。

      如上圖所示,我在右邊的可編程欄設(shè)置了字體大小,只要保存這個(gè)文檔,Sublime Text已經(jīng)打開的窗口會(huì)立即執(zhí)行。

      Sublime Text支持同時(shí)選擇多個(gè)區(qū)域,然后同時(shí)進(jìn)行編輯。Ctrl + D選擇當(dāng)前光標(biāo)所在的詞并高亮該詞所有出現(xiàn)的位置,再次Ctrl + D選擇該詞出現(xiàn)的下一個(gè)位置,在多重選詞的過程中,使用Ctrl + K進(jìn)行跳過,使用Ctrl + U進(jìn)行回退,使用Esc退出多重編輯。這樣真是太棒了,寫代碼的人感覺自己的效率提升很多!

      PyCharm

      PyCharm是一個(gè)用于計(jì)算機(jī)編程的集成開發(fā)環(huán)境(IDE),主要用于Python語言開發(fā),由捷克公司JetBrains開發(fā),提供代碼分析、圖形化調(diào)試器,集成測試器、集成版本控制系統(tǒng),并支持使用Django進(jìn)行網(wǎng)頁開發(fā)。PyCharm是一個(gè)跨平臺開發(fā)環(huán)境,擁有Microsoft Windows、macOS和Linux版本。社區(qū)版在Apache許可證下發(fā)布,另外還有專業(yè)版在專用許可證下發(fā)布,其擁有許多額外功能。

      PyCharm非常強(qiáng)大,幾乎所有你自己可以想到的功能它都包含在內(nèi)。我覺得判斷一個(gè)IDE的生命力,我們應(yīng)該重點(diǎn)看是否支持代碼重構(gòu)和利用周邊生態(tài)(例如公有云計(jì)算資源),所以我這里重點(diǎn)介紹這兩個(gè)特性。

      首先講代碼重構(gòu)。重構(gòu)指的是使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)。我們通常所講的代碼重構(gòu),最常見是的有幾類,例如重復(fù)代碼(一個(gè)以上的地點(diǎn)看到相同的程序結(jié)構(gòu))、過長的類(一般不超過500行)、過長參數(shù)列(太長的參數(shù)列難以理解,太多的參數(shù)會(huì)造成前后不一致、不容易使用,而且一旦你需要更多數(shù)據(jù),就不得不修改它)、發(fā)散式變化(如果某個(gè)類經(jīng)常因?yàn)椴煌脑蛟诓煌姆较蛏习l(fā)生變化,那么此時(shí)也許將這個(gè)對象分成兩個(gè)會(huì)更好,這么一來每個(gè)對象就可以只因?yàn)橐环N變化而需要修改)、冗余類,等等。

      我們看一下具體的案例:

      1、? 常量和臨時(shí)變量

      假設(shè)如以下代碼所示,你有一個(gè)字面數(shù)值, 帶有特別含義. 創(chuàng)建一個(gè)常量, 根據(jù)其意義為它命名, 并將上述字面數(shù)值替換為這個(gè)常量。

      def potential_energy(mass, height):

      return mass * 9.81 * height

      這里的9.81,改為GRAVITATIONAL_CONSTANT比較合適,

      選Constant:

      將代碼改為如下圖所示:

      2、復(fù)雜表達(dá)式的簡單化,例如以下代碼:

      if "MAC" in platform.upper() and "IE" in browser.upper() and was_initialized() and resize > 0:

      #do something

      我們可以把"MAC" in platform.upper()改為變量,也就是說以變量名稱來解釋表達(dá)式用途。

      代碼最終被重構(gòu)如下圖所示:

      3、? 抽象出可以復(fù)用的方法,減少業(yè)務(wù)方法的代碼量。這里舉一個(gè)最大公約數(shù)的示例代碼

      原始代碼如下:

      現(xiàn)在我們將最大公約數(shù)提取到單獨(dú)的方法中,選中上面這張圖中的10-14行代碼,點(diǎn)擊‘重構(gòu)’按鈕。

      代碼重構(gòu)為:

      變量factor通過使用 Inline variable重構(gòu)來擺脫變量。我們選中變量factor,然后按Ctrl+Alt+N。所有檢測到的factor變量都是內(nèi)聯(lián)的。

      使用使用Change Signature更改參數(shù)名稱。選中方法聲明行,然后按Ctrl+F6。在打開的dialog box中,分別將參數(shù)denom和num重命名為x和y,然后單擊圖標(biāo)節(jié)點(diǎn)upLevel以更改參數(shù)的順序。

      除了本地IDE工具功能以外,PyCharm能不能做得更好?我覺得就PyCharm自身來看,發(fā)展已經(jīng)上了正規(guī),我認(rèn)為目前應(yīng)該做的是生態(tài)的擴(kuò)展,或者說聯(lián)合。與誰聯(lián)合?與公有云。如果能夠做到在本地編碼、利用公有云的計(jì)算資源進(jìn)行調(diào)試,那相當(dāng)于做到了云邊協(xié)同。華為云ModelArts提供了插件,支持讓本地的PyCharm與ModelArts結(jié)合在一起使用(詳細(xì)的過程請參考文檔:https://bbs.huaweicloud.com/blogs/160467)。

      我們實(shí)際上只需要做三個(gè)步驟,即可支持本地的PyCharm與ModelArts平臺結(jié)合使用:

      1、? 下載并安裝插件;

      2、? ModelArts網(wǎng)站申請秘鑰;

      3、? PyCharm填寫秘鑰鍵值對。

      你把PyCharm想象成C/S設(shè)計(jì)模式的Client端,把ModelArts想象成Server端,就容易理解了。

      我這里舉一個(gè)實(shí)際的使用案例—手寫字模型訓(xùn)練案例。

      首先,下載手寫字的數(shù)據(jù)集:https://modelarts-cnnorth1-market-dataset.obs.cn-north-1.myhuaweicloud.com/dataset-market/Mnist-Data-Set/archiver/Mnist-Data-Set.zip

      登錄華為云上傳OBS:

      創(chuàng)建兩個(gè)文件夾,一個(gè)用于存放數(shù)據(jù)集,一個(gè)用于存放訓(xùn)練生成的日志(需要傳回到PyCharm IDE并顯示):

      填寫參數(shù),可以參考ModelArts訓(xùn)練模型時(shí)填寫的參數(shù):

      接著在PyCharm打開工程,點(diǎn)擊“Run Training Job”:

      上面的日志輸出中,左下角是本地的輸出,右下角是ModelArts返回的云端訓(xùn)練日志。

      訓(xùn)練完成后,訓(xùn)練模型保存在OBS中 /工程名/output/V0006/。

      Jupyter Notebook

      在AI研究探索場景中,Jupyter 作為一個(gè)特殊的存在迅速成長為AI探索類場景開發(fā)的首選,能夠在其各個(gè)階段滿足開發(fā)者訴求并覆蓋這些關(guān)鍵點(diǎn),以及支持在瀏覽器中使用的特點(diǎn)。

      Jupyter 起始于 IPython 項(xiàng)目,IPython 最初是專注于 Python 的項(xiàng)目,但隨著項(xiàng)目發(fā)展壯大,已經(jīng)不僅僅局限于 Python 這一種編程語言了。按照J(rèn)upyter創(chuàng)始人的想法,最初的目標(biāo)是做一個(gè)能直接支持Julia(Ju),Python(Py)以及R三種科學(xué)運(yùn)算語言的交互式計(jì)算工具平臺,所以將他命名為Ju-Py-te-R,發(fā)展到現(xiàn)在Jupyter已經(jīng)成為一個(gè)幾乎支持所有語言,能夠把代碼、計(jì)算輸出、解釋文檔,多媒體資源整合在一起的多功能科學(xué)運(yùn)算平臺。

      這里需要提到的另外一個(gè)概念就是“文學(xué)編程”,文學(xué)編程是一種由Donald Knuth提出的編程范式。這種范式提供了用自然語言來解釋程序邏輯的機(jī)會(huì)。簡單來說,文學(xué)編程的讀者不是機(jī)器,而是人。 從寫出讓機(jī)器讀懂的代碼,過渡到向人們解說如何讓機(jī)器實(shí)現(xiàn)我們的想法,其中除了代碼,更多的是敘述性的文字、圖表等內(nèi)容。 文學(xué)編程中間穿插著宏片段和傳統(tǒng)的源代碼,從中可以生成可編譯的源代碼。

      作為第一個(gè)貫穿整個(gè)科學(xué)計(jì)算研究的生命周期工具平臺,可以將可以分解為,如果我們將科學(xué)計(jì)算研究全生命周期分解為,個(gè)人探索,協(xié)作與分享,生產(chǎn)化運(yùn)行環(huán)境,發(fā)表與教學(xué),Notebook都可以在這些階段中滿足科研工作的需求。

      Jupyter有沒有缺點(diǎn)?有的。如果你追求的是產(chǎn)品化代碼開發(fā),例如代碼格式、依賴管理、產(chǎn)品打包、單元測試等等功能在IDE中是沒有很好的支持,當(dāng)前有一些插件可以做,但是相比重型IDE,功能還是比較弱。此外,Jupyter定義為研究類調(diào)試環(huán)境,一方面對于分布式的任務(wù)當(dāng)前推薦都是通過單機(jī)多進(jìn)程的方式進(jìn)行模擬,真實(shí)到有多節(jié)點(diǎn)拓?fù)湫畔⒌牟糠衷贘upyter中不容易實(shí)現(xiàn),另外一方面,Jupyter的架構(gòu)并不適合跑非常重量級的作業(yè)。對于真實(shí)軟件產(chǎn)品開發(fā)的訴求,還是需要在IDE中進(jìn)行工程化代碼開發(fā),并配搭測試邏輯,將任務(wù)部署在集群中進(jìn)行運(yùn)行。

      我們具體看看Jupyter如何工作的?首先在公有云上創(chuàng)建一個(gè)Notebook,點(diǎn)擊“打開”按鈕,如下圖所示:

      選擇基于那個(gè)計(jì)算引擎(例如TensorFlow-1.8),如下圖所示:

      輸出代碼片段,在第一段代碼中由于已經(jīng)請求了用戶輸入,所以需要我們輸入一個(gè)數(shù)字,只要是正常的整形數(shù)字,不會(huì)報(bào)錯(cuò),如下圖所示:

      后記

      這篇文章的后記比較難寫,因?yàn)楣ぞ呖偸窃诓粩喟l(fā)展的,我們很難預(yù)料未來某一個(gè)工具的發(fā)展方向和趨勢,但是,永恒的定律是工具一定是為開發(fā)者服務(wù)的,一定是越來越簡單。

      編輯器和IDE根本是面向兩種不同使用場景的工具:

      l? 編輯器面向無語義的純文本,不涉及領(lǐng)域邏輯,因此速度快體積小,適合編寫單獨(dú)的配置文件和動(dòng)態(tài)語言腳本(Shell、Python和Ruby等);

      l? IDE面向有語義的代碼,會(huì)涉及到大量領(lǐng)域邏輯,因此速度偏慢體積龐大,適合編寫靜態(tài)語言項(xiàng)目(Java、C++和C#等)。

      個(gè)人認(rèn)為應(yīng)當(dāng)使用正確的工具去做有價(jià)值的事情,并把效率最大化,所以我會(huì)用IntelliJ IDEA編寫Java項(xiàng)目,用Vim編寫Shell,用Sublime Text編寫JavaScript/HTML/Python,用Visual Studio編寫C#。

      工具再好用,代碼還是你自己寫的,因此本文的最后,我引用Python之禪(在Python交互式解釋器中輸 入import this就會(huì)顯示Tim Peters的The Zen of python):

      >>> import this

      The Zen of Python, by Tim Peters

      Beautiful is better than ugly. 優(yōu)美優(yōu)于丑陋(以編寫優(yōu)美的代碼為目標(biāo))

      Explicit is better than implicit. 明了優(yōu)于隱晦(優(yōu)美的代碼應(yīng)當(dāng)是簡潔明了的)

      Simple is better than complex. 簡單優(yōu)于復(fù)雜(避免存在過多的復(fù)雜內(nèi)部實(shí)現(xiàn))

      Complex is better than complicated. 復(fù)雜優(yōu)于凌亂(保持接口簡潔)

      Flat is better than nested. 扁平優(yōu)于嵌套(避免多層嵌套)

      Sparse is better than dense. 間隔勝于緊湊(保持適當(dāng)?shù)拈g隔,不要奢望一行代碼解決問題)

      Readability counts. 可讀性很重要(保持并不斷提提升代碼的可閱讀感)

      Special cases aren't special enough to break the rules. 即使實(shí)用比純粹更優(yōu)

      Although practicality beats purity. 特例亦不可違背原則

      Errors should never pass silently. 錯(cuò)誤絕不能悄悄忽略

      Unless explicitly silenced. 除非它明確需要如此

      In the face of ambiguity, refuse the temptation to guess. 面對不確定性拒絕妄加猜測

      There should be one-- and preferably only one --obvious way to do it. 任何問題應(yīng)有一種且最好只有一種顯而易見的解決方法

      Although that way may not be obvious at first unless you're Dutch. 盡管這方法一開始并非如此直觀除非你是荷蘭人(指的是Python之父荷蘭人Guido van Rossum)

      Now is better than never. 做優(yōu)于不做

      Although never is often better than *right* now. 然而不假思索還不如不做

      If the implementation is hard to explain, it's a bad idea. 很難解釋的,必然是壞方法

      If the implementation is easy to explain, it may be a good idea. 很好解釋的,可能是好方法

      Namespaces are one honking great idea -- let's do more of those! 提倡使用命名空間

      上面這些準(zhǔn)備,并不單單適用于Python,編程語言體系都適用。

      Jupyter notebook Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:從內(nèi)核、基礎(chǔ)外設(shè),再到傳感器、WiFi編程,看HarmonyOS如何駕馭小熊派開發(fā)板
      下一篇:使用AppCube應(yīng)用魔方創(chuàng)建AppCube官網(wǎng)頁面(PC端+移動(dòng)端)- 詳細(xì)開發(fā)過程(二)
      相關(guān)文章
      亚洲国产成人久久三区| 亚洲福利视频网站| 亚洲国产成人精品久久| 亚洲色成人网站WWW永久| 亚洲无码精品浪潮| 亚洲精品无码久久久| 亚洲JIZZJIZZ中国少妇中文| 亚洲av第一网站久章草| 亚洲另类自拍丝袜第五页| 亚洲老熟女五十路老熟女bbw| 亚洲精品国产精品| 蜜芽亚洲av无码一区二区三区 | 久久精品7亚洲午夜a| 亚洲av中文无码乱人伦在线咪咕| 亚洲av午夜成人片精品网站 | 久久亚洲精品成人综合| 亚洲国产天堂久久综合网站| 久久精品国产亚洲AV无码娇色| 亚洲三级电影网址| 亚洲精品日韩专区silk| 亚洲一区二区三区深夜天堂| 国产亚洲精品bv在线观看| 亚洲美国产亚洲AV| 亚洲?V无码成人精品区日韩| 久久综合亚洲色HEZYO国产| 亚洲精品自产拍在线观看| 亚洲av无码国产精品色午夜字幕| 一区二区三区亚洲| 亚洲综合激情视频| 亚洲H在线播放在线观看H| 亚洲精品蜜夜内射| 亚洲第一网站男人都懂| 亚洲色大成网站www永久一区| 亚洲av片劲爆在线观看| 亚洲乱人伦精品图片| 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲AV日韩精品一区二区三区 | 亚洲欧洲美洲无码精品VA| 亚洲一区精品中文字幕| 亚洲一区二区三区在线| 亚洲成在人线aⅴ免费毛片|