寫給.NET開發者的Python教程(一):C# vs Python: 語言特性、Conda和Jupyter Notebook環境

msp的昌偉哥哥發表於2020-07-05

承接上篇,本文會從語言特性、開發環境和必備工具來帶領大家進入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;
    }
}

 

同樣的一段邏輯,藉助一個字典快速找出兩個目標數字。但是從程式碼結構上來看,至少有以下幾點差異:

  1. Python程式碼不以;號換行
  2. Python以縮排來確定程式碼層級,這個槽點比較多(遊標卡尺梗)
  3. Python不使用public之類的訪問修飾符
  4. Python不要求宣告物件型別(可以主動宣告),動態型別
  5. Python使用def定義方法,同時不要求宣告返回值型別(可以主動宣告)
  6. 迴圈語句和條件語句與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

 

相關文章