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