摘要:Python是一種跨平臺的編程語言,可以在全部主要的操做系統上,運行你編寫的任何Python程序。今天介紹幾款常見的工具:Python自帶的解釋器、文本編輯器(Geany、Sublime Text)、主流IDE(PyCharm、Jupyter Notebook),以及如何使用公有云的計算資源在本地開發。
Python is getting more attention than usual this year, becoming one of the most popular programming languages in the world.python
-- by Krzysztgit
對於技術類文章,我通常都會聯想到一些高大上的描述,或是一些人文故事。可是,對於Python這樣的全民化編程語言,我以爲上面這句來自Krzyszt的口語化描述,就足夠了。程序員
Python是一種跨平臺的編程語言,這就意味着它可以在全部主要的操做系統上,運行你編寫的任何Python程序。今天文章裏要給你們具體講講幾款常見的工具,包括了Python自帶的解釋器、文本編輯器(Geany、Sublime Text)、主流IDE(PyCharm、Jupyter Notebook),以及如何使用公有云的計算資源在本地開發。編程
Python自帶了一個在終端窗口中運行的解釋器,你無需保存代碼,支持直接運行整個程序,以下所示:設計模式
Geany是一款簡單的文本編輯器,安裝很容易,支持直接運行幾乎全部的程序(不須要經過終端運行),支持使用顏色區分關鍵代碼,突出代碼語法。瀏覽器
咱們能夠在官網下載Geany軟件:geany.org/。bash
安裝完成後,首先在本地建立一個文件夾用於保存和運行代碼,例如python_work文件夾。架構
建立一個新文件,而且經過「SAVE AS」保存到pytthon_word文件夾。less
若是你已經安裝了python,也就是說,若是能在系統中執行命令python,就無需配置Geany,若是不能執行順利執行python命令就須要對Geany進行配置。編程語言
涉及到編碼代碼和運行代碼的是「生成」按鈕,以下圖所示:
先來執行一個helloWolrld命令,以下圖所示:
進一步解釋「生成」下拉框所列的功能,我採用的是「阿姆斯特朗數」,即若是一個n位正整數等於其各位數字的n次方之和,則稱該數爲阿姆斯特朗數。 例如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」:編譯代碼,相似於執行了python -m py_compile helloWorld.py,生成.pyc文件。pyc是一種二進制文件,是由py文件通過編譯後生成的文件,屬於byte code。py文件變成pyc文件後,加載的速度有所提升,並且pyc是一種跨平臺的字節碼,是由python的虛擬機來執行的,這個是相似於JAVA或者.NET的虛擬機的概念。pyc的內容和python的版本相關,不一樣版本編譯後的pyc文件不徹底相同,例如v2.5編譯的pyc文件在v2.4版本的 python上是沒法執行的。
「Lint」:這個功能會對代碼作靜態檢測,例如製表符、空格、變量命名等等是否符合要求,本案例中部分行只縮進了3個空格,第18行的「num,」後面缺乏空格,報錯以下所示:
代碼改動完畢後就顯示編譯正常,以下圖所示:
「生成目標文件」:運行」make current_file.o」 文件,好處是隻會編譯當前指定的文件,而不是整個項目。
「Execute」:實際上調用Python的終端編譯器,以下圖所示:
Geany的操做界面和編譯器支持個性化配置,這裏不逐一展開,你能夠本身經過「編輯」-「首選項」嘗試。
和Geany相似,Sublime Text是一款簡單的文本編輯器,可以直接運行幾乎全部程序(無需經過終端),支持使用不一樣的顏色顯示關鍵代碼,突出代碼語法。
Sublime Text的優勢:
從使用的角度看,Sublime Text真的是針對程序員的工具,舉一個例子,它的全部設置都是經過JSON配置文件完成的,支持你本身寫配置文件的方式,感受很好。
如上圖所示,我在右邊的可編程欄設置了字體大小,只要保存這個文檔,Sublime Text已經打開的窗口會當即執行。
Sublime Text支持同時選擇多個區域,而後同時進行編輯。Ctrl + D選擇當前光標所在的詞並高亮該詞全部出現的位置,再次Ctrl + D選擇該詞出現的下一個位置,在多重選詞的過程當中,使用Ctrl + K進行跳過,使用Ctrl + U進行回退,使用Esc退出多重編輯。這樣真是太棒了,寫代碼的人感受本身的效率提高不少!
PyCharm是一個用於計算機編程的集成開發環境(IDE),主要用於Python語言開發,由捷克公司JetBrains開發,提供代碼分析、圖形化調試器,集成測試器、集成版本控制系統,並支持使用Django進行網頁開發。PyCharm是一個跨平臺開發環境,擁有Microsoft Windows、macOS和Linux版本。社區版在Apache許可證下發布,另外還有專業版在專用許可證下發布,其擁有許多額外功能。
PyCharm很是強大,幾乎全部你本身能夠想到的功能它都包含在內。我以爲判斷一個IDE的生命力,咱們應該重點看是否支持代碼重構和利用周邊生態(例如公有云計算資源),因此我這裏重點介紹這兩個特性。
首先講代碼重構。重構指的是使用一系列重構手法,在不改變軟件可觀察行爲的前提下,調整其結構。咱們一般所講的代碼重構,最多見是的有幾類,例如重複代碼(一個以上的地點看到相同的程序結構)、過長的類(通常不超過500行)、過長參數列(太長的參數列難以理解,太多的參數會形成先後不一致、不容易使用,並且一旦你須要更多數據,就不得不修改它)、發散式變化(若是某個類常常由於不一樣的緣由在不一樣的方向上發生變化,那麼此時也許將這個對象分紅兩個會更好,這麼一來每一個對象就能夠只由於一種變化而須要修改)、冗餘類,等等。
咱們看一下具體的案例:
一、 常量和臨時變量
假設如如下代碼所示,你有一個字面數值, 帶有特別含義. 建立一個常量, 根據其意義爲它命名, 並將上述字面數值替換爲這個常量。
def potential_energy(mass, height):
return mass * 9.81 * height複製代碼
這裏的9.81,改成GRAVITATIONAL_CONSTANT比較合適,
選Constant:
將代碼改成以下圖所示:
二、複雜表達式的簡單化,例如如下代碼:
if "MAC" in platform.upper() and "IE" in browser.upper() and was_initialized() and resize > 0:
#do something複製代碼
咱們能夠把"MAC" in platform.upper()改成變量,也就是說以變量名稱來解釋表達式用途。
代碼最終被重構以下圖所示:
三、 抽象出能夠複用的方法,減小業務方法的代碼量。這裏舉一個最大公約數的示例代碼
原始代碼以下:
如今咱們將最大公約數提取到單獨的方法中,選中上面這張圖中的10-14行代碼,點擊‘重構’按鈕。
代碼重構爲:
變量factor經過使用 Inline variable重構來擺脫變量。咱們選中變量factor,而後按Ctrl+Alt+N。全部檢測到的factor變量都是內聯的。
使用使用Change Signature更改參數名稱。選中方法聲明行,而後按Ctrl+F6。在打開的dialog box中,分別將參數denom和num重命名爲x和y,而後單擊圖標節點upLevel以更改參數的順序。
除了本地IDE工具功能之外,PyCharm能不能作得更好?我以爲就PyCharm自身來看,發展已經上了正規,我認爲目前應該作的是生態的擴展,或者說聯合。與誰聯合?與公有云。若是可以作到在本地編碼、利用公有云的計算資源進行調試,那至關於作到了雲邊協同。華爲雲ModelArts提供了插件,支持讓本地的PyCharm與ModelArts結合在一塊兒使用(詳細的過程請參考文檔:bbs.huaweicloud.com/blogs/16046…)。
咱們實際上只須要作三個步驟,便可支持本地的PyCharm與ModelArts平臺結合使用:
一、 下載並安裝插件;
二、 ModelArts網站申請祕鑰;
三、 PyCharm填寫祕鑰鍵值對。
你把PyCharm想象成C/S設計模式的Client端,把ModelArts想象成Server端,就容易理解了。
我這裏舉一個實際的使用案例—手寫字模型訓練案例。
首先,下載手寫字的數據集:modelarts-cnnorth1-market-dataset.obs.cn-north-1.myhuaweicloud.com/dataset-mar…
登陸華爲雲上傳OBS:
建立兩個文件夾,一個用於存放數據集,一個用於存放訓練生成的日誌(須要傳回到PyCharm IDE並顯示):
填寫參數,能夠參考ModelArts訓練模型時填寫的參數:
接着在PyCharm打開工程,點擊「Run Training Job」:
上面的日誌輸出中,左下角是本地的輸出,右下角是ModelArts返回的雲端訓練日誌。
訓練完成後,訓練模型保存在OBS中 /工程名/output/V0006/。
在AI研究探索場景中,Jupyter 做爲一個特殊的存在迅速成長爲AI探索類場景開發的首選,可以在其各個階段知足開發者訴求並覆蓋這些關鍵點,以及支持在瀏覽器中使用的特色。
Jupyter 起始於 IPython 項目,IPython 最初是專一於 Python 的項目,但隨着項目發展壯大,已經不只僅侷限於 Python 這一種編程語言了。按照Jupyter創始人的想法,最初的目標是作一個能直接支持Julia(Ju),Python(Py)以及R三種科學運算語言的交互式計算工具平臺,因此將他命名爲Ju-Py-te-R,發展到如今Jupyter已經成爲一個幾乎支持全部語言,可以把代碼、計算輸出、解釋文檔,多媒體資源整合在一塊兒的多功能科學運算平臺。
這裏須要提到的另一個概念就是「文學編程」,文學編程是一種由Donald Knuth提出的編程範式。這種範式提供了用天然語言來解釋程序邏輯的機會。簡單來講,文學編程的讀者不是機器,而是人。 從寫出讓機器讀懂的代碼,過渡到向人們解說如何讓機器實現咱們的想法,其中除了代碼,更多的是敘述性的文字、圖表等內容。 文學編程中間穿插着宏片斷和傳統的源代碼,從中能夠生成可編譯的源代碼。
做爲第一個貫穿整個科學計算研究的生命週期工具平臺,能夠將能夠分解爲,若是咱們將科學計算研究全生命週期分解爲,我的探索,協做與分享,生產化運行環境,發表與教學,Notebook均可以在這些階段中知足科研工做的需求。
Jupyter有沒有缺點?有的。若是你追求的是產品化代碼開發,例如代碼格式、依賴管理、產品打包、單元測試等等功能在IDE中是沒有很好的支持,當前有一些插件能夠作,可是相比重型IDE,功能仍是比較弱。此外,Jupyter定義爲研究類調試環境,一方面對於分佈式的任務當前推薦都是經過單機多進程的方式進行模擬,真實到有多節點拓撲信息的部分在Jupyter中不容易實現,另一方面,Jupyter的架構並不適合跑很是重量級的做業。對於真實軟件產品開發的訴求,仍是須要在IDE中進行工程化代碼開發,並配搭測試邏輯,將任務部署在集羣中進行運行。
咱們具體看看Jupyter如何工做的?首先在公有云上建立一個Notebook,點擊「打開」按鈕,以下圖所示:
選擇基於那個計算引擎(例如TensorFlow-1.8),以下圖所示:
輸出代碼片斷,在第一段代碼中因爲已經請求了用戶輸入,因此須要咱們輸入一個數字,只要是正常的整形數字,不會報錯,以下圖所示:
這篇文章的後記比較難寫,由於工具老是在不斷髮展的,咱們很難預料將來某一個工具的發展方向和趨勢,可是,永恆的定律是工具必定是爲開發者服務的,必定是愈來愈簡單。
編輯器和IDE根本是面向兩種不一樣使用場景的工具:
我的認爲應當使用正確的工具去作有價值的事情,並把效率最大化,因此我會用IntelliJ IDEA編寫Java項目,用Vim編寫Shell,用Sublime Text編寫JavaScript/HTML/Python,用Visual Studio編寫C#。
工具再好用,代碼仍是你本身寫的,所以本文的最後,我引用Python之禪(在Python交互式解釋器中輸 入import this就會顯示Tim Peters的The Zen of python):
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly. 優美優於醜陋(以編寫優美的代碼爲目標)
Explicit is better than implicit. 明瞭優於隱晦(優美的代碼應當是簡潔明瞭的)
Simple is better than complex. 簡單優於複雜(避免存在過多的複雜內部實現)
Complex is better than complicated. 複雜優於凌亂(保持接口簡潔)
Flat is better than nested. 扁平優於嵌套(避免多層嵌套)
Sparse is better than dense. 間隔勝於緊湊(保持適當的間隔,不要奢望一行代碼解決問題)
Readability counts. 可讀性很重要(保持並不斷提提高代碼的可閱讀感)
Special cases aren't special enough to break the rules. 即便實用比純粹更優 Although practicality beats purity. 特例亦不可違背原則 Errors should never pass silently. 錯誤毫不能悄悄忽略 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. 任何問題應有一種且最好只有一種顯而易見的解決方法 Although that way may not be obvious at first unless you're Dutch. 儘管這方法一開始並不是如此直觀除非你是荷蘭人(指的是Python之父荷蘭人Guido van Rossum)
Now is better than never. 作優於不作
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! 提倡使用命名空間複製代碼
上面這些準備,並不僅僅適用於Python,編程語言體系都適用。