承接上篇,本文會從語言特性、開發環境和必備工具來帶領大家進入Python的世界。
語言特性
首先一起看下C#和Python在語言特性層面的對比,他們作為截然不同的兩類物件導向高階語言,在語言層面上有何異同。
注:本系列均採用.NET Core為C#程式碼的執行環境,Python則為Python 3
上表對部分語言特性簡單做了對比,C#作為一門編譯型靜態語言,和Python這樣的解釋性動態語言,雖然差異較大,但同為面向向物件的高階語言,Python的很多概念仍然是無關程式語言的。
Python的特性概括來講如下:
- 包含大量的基礎型別,如:數字(int, float,long)、字串(ASCII和Unicode)、集合(list)和字典等
- 支援物件導向程式設計,支援類和多繼承
- 支援程式碼模組和庫
- 支援異常捕獲。允許丟擲異常獲得更清晰的錯誤資訊
- 動態型別,但有限支援強型別。不相容的型別一起運算(例如字串和整形相加)會導致丟擲異常,幫助快速定位錯誤。
- 支援高階程式設計特性,例如generator(類似C#的迭代器),列表生成式等
- 自動記憶體管理。不必從程式碼手動管理記憶體
現在來看個LeetCode上經典問題兩數之和的例子,粗略感受下語法差異。這兩段程式碼都要從陣列nums裡面,找出相加和等於target的兩個整數,用陣列的形式返回:
Python
class Solution: def twoSum(self, nums, target): dict={} for i in range(len(nums)): n=nums[i] t=target-n if t in dict: return [dict[t],i] dict[n]=i return None
C#
public class Solution { public int[] TwoSum(int[] nums, int target) { var dict=new Dictionary<int,int>(); for(var i=0;i<nums.Length;i++){ var t=target-nums[i]; if(dict.ContainsKey(t)){ return new int[]{dict[t],i}; }else{ dict[nums[i]]=i; } } return null; } }
同樣的一段邏輯,藉助一個字典快速找出兩個目標數字。但是從程式碼結構上來看,至少有以下幾點差異:
- Python程式碼不以;號換行
- Python以縮排來確定程式碼層級,這個槽點比較多(遊標卡尺梗)
- Python不使用public之類的訪問修飾符
- Python不要求宣告物件型別(可以主動宣告),動態型別
- Python使用def定義方法,同時不要求宣告返回值型別(可以主動宣告)
- 迴圈語句和條件語句與C#語法不同,使用:號宣告程式碼塊,後續會詳細介紹
這也是大多熟悉C語言系語法的開發人員不習慣Python的原因,其獨特的語法需要我們先熟悉。
Think in Python
編寫Pyhton程式碼的思考方式和我們編寫C++/C#時是完全不一樣的,對於其它語言的開發人員下面的幾個建議是非常棒的:
- python.org的文件非常棒,簡潔明瞭。好訊息是官方文件有中文版,不用破費錢包去買書了也不用擔心英文看不懂,官方文件完全夠了
- 儘早掃一遍內建的庫和函式名,熟悉這些內建函式,可以大大減少你的程式碼量!
- 丟掉大部分花括號和分號,Python裡大部分場景都不會用到
- Python的字串也是不可變的,每次改動都會建立一個新的字串物件。這點和C#一致
- Python不支援函式過載。但函式引數為動態型別且可傳遞動態數量的引數,因此可以達到接近函式過載的效果
- Python沒有指標,一切都是物件引用
- 至少閱讀一次官方教程,然後瀏覽下函式庫參考文件(至少看一下目錄,你遇到的大部分問題裡面可能會有可以幫到你的)
Conda和開發環境
對.NET開發人員而言,Conda(Anaconda)是個陌生的工具,但它可謂是目前機器學習必備的開發環境。Anaconda是一套資料科學工具包,在全球擁有 2000 多萬使用者,是單臺機器上進行Python/R 資料科學和機器學習開發最簡單的方法。它是世界上最流行的Python分發平臺,包含了使用數千個開源包和庫,個人版是開源免費的。
我們的目標是讓C#開發者也能使用Python進行機器學習開發,因此採用Anaconda作為Python開發環境。下面開始安裝Anaconda,這裡我們安裝Windows版:https://repo.anaconda.com/archive/Anaconda3-2020.02-Windows-x86_64.exe
目前Anaconda預設可選的Python版本有兩個,分別是3.7和2.7。鑑於2.7已經不再更新,因此對於新程式的開發,採用Python 3更合適。
安裝過程沒什麼難度,這裡建議勾選“將Anaconda新增到Path環境變數”。這樣可以直接使用conda命令,熟練後在PowerShell裡直接操作命令列會非常方便。
PyCharm是一款流行的功能強大的IDE,這裡提供了針對Anaconda的免費社群版,推薦使用。同時強烈安利微軟的VSCode,對Anaconda的整合也做得很棒。
一旦安裝完成,在開始選單中即可看到Anaconda Navigator和Jupytor Notebook等應用。Anaconda Navigator是一個視覺化管理conda環境的應用,可以管理Python環境、切換包來源和安裝工具。所有功能均可以通過命令列操作,熟練之後使用CLI命令會效率更高。
由於Conda原始源在國內速度較慢,建議切換到國內源。這裡推薦華中科技大學的conda源,新增方法如下:
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ conda config --set show_channel_urls yes
此外,如您電腦此前無python環境,此時預設的python環境將會成為conda的環境。
關於conda的教程我這裡不再贅述,大家可以自行查閱Conda文件以瞭解。
Jupyter Notebook
和Conda一樣,Jupyter Notebook同樣是機器學習必不可缺的一款Python視覺化互動程式設計軟體。它允許我們像記筆記一樣,將文字和程式碼混合到一起,並能將程式碼執行結果視覺化展示,提供非常直觀的開發體驗。
Jupyter Notebook目前支援超過40多種程式語言,包括Python和C#;同時允許將notebook匯出為多種格式,包括HTML、圖片, 視訊, LaTeX, 和自定義MIME型別的檔案.;此外很多大資料工具和語言都整合了它,例如Apache Spark, Python, R 、Scala、pandas, scikit-learn, ggplot2, TensorFlow等等。
conda預設就包含了Jupyter Notebook因此可以直接啟動,這會開啟一個瀏覽器視窗,這就是Jupyter notebook的入口。在這裡可以操作檔案,編寫notebook。
點選右上角New按鈕,即可建立新筆記本。此時要為筆記本選擇一個Kenerl(執行環境),我這裡整合了C#的外掛,因此可以看到.NET執行環境:
這裡我分別建立一個Python筆記本notebook-py.和一個C#筆記本notebook-c#,分別執行上面的示例程式碼,效果如下:
關於如何安裝C#外掛到Jupyter Notebook,請檢視微軟官方部落格:
https://devblogs.microsoft.com/dotnet/net-core-with-juypter-notebooks-is-here-preview-1/
總結
最後,本章就先介紹Pyhton和必備元件就先到這裡了,後續將詳細介紹Python的核心語法,歡迎訂閱。
本文的notebook均可在Github獲取到,歡迎下載?: https://github.com/ChangweiZhang/Python-Tour-For-dotnet