開篇的話:任何⼀⻔語⾔都不是完美的,建議各位不要拿⼀個語⾔的劣勢去跟另⼀個語⾔的優勢來去⽐較,語⾔只是⼀個⼯具。正如天龍八部里面,蕭峰蕭大俠用太祖長拳PK少林功夫一般。存在即合理!我想應該不用我說了吧,PHP......

喬峰眼見旁人退開,驀地心念一動,呼的一拳打出,一招“沖陣斬將”,也正是“太祖長拳”中的招數。這一招姿工既瀟灑大方已極,勁力更是剛中有柔,柔中有剛,武林高手畢生所盼望達到的拳術完美之境,竟在這一招中青露無遺。來到這英雄宴中的人物,就算本身武功不是甚高,見識也必廣博,“太祖拳法”的精要所在,可說無人不知。喬峰一招打出,人人都是情不自禁的喝了一聲采!
這滿堂大采之后,隨即有許多人覺得不妥,這聲喝采,是贊譽各人欲殺之而甘心的胡虜大敵,如何可以長敵人志氣,滅自己威風?但采聲已然出口,再也縮不回來,眼見喬峰第二招“河朔立威”一般的精極妙極,比之他第一招,實難分辨到底哪一招更為佳妙,大廳上仍有不少人大聲喝采。只是有些人憬然驚覺,自知收斂,采聲便不及第一招時那么響亮,但許多“哦,哦”“呵,呵!”的低聲贊嘆,欽服之忱,未必不及那大聲叫好。喬峰初時和各人狠打惡斗,群雄專顧御敵,只是懼怕他的凶悍厲害,這時暫且置身事外,方始領悟到他武功中的精妙絕倫之處。
但見喬峰和玄難只拆得七八招,高下已判。他二人所使的拳招,都是一般的平平無奇,但喬峰每一招都是慢了一步,任由玄難先發。玄難一出招,喬峰跟着遞招,也不知是由於他年輕力壯,還是行動加倍的迅捷,每一招都是后發先至。這“太祖長拳”本身拳招只有六十四招,但每一招都是相互克制,喬峰看准了對方的拳招,然后出一招愉好克制的拳法,玄難焉得不敗?這道理誰都明白,可是要做到“后發先至”四字,尤其是對敵玄難這等大高手,眾人若非今日親眼得見,以往連想也從未想到過。
宏觀對比
一、語言類型
1:編譯型語言vs解釋型語言
1.1 what&why?什么是編譯型語言?什么是解釋型語言?為什么要區分編輯型和解釋型
計算機不能直接認識並執⾏我們寫的語句,它只能認識機器語⾔(是⼆進制的形式)。
通過編譯器是把源程序的每⼀條語句都編譯成機器語⾔,並保存成⼆進制⽂件,這樣運⾏時計算機可以直接以機器語⾔來運⾏此程序,速度很快;

1.2 C#和python分別屬於哪種類型?他們的優缺點是什么?
C#可以認為是編譯型語言(嚴格的說是混合型),python屬於解釋型語言。
C#的優點是快,運行速度快。因為編譯只做⼀次,運⾏時不需要編譯,所以編譯型語⾔的程序執⾏效率⾼。
編譯是一把雙刃劍,代碼如果修改就需要整個模塊重新編譯,而且需要根據運⾏的操作系統環境編譯不同的可執⾏⽂件。
正所謂:魚和熊掌不可兼得。python的優點就是跨平台比較強,代碼修改不需要停機,缺點就是每次運⾏的時候都要解釋⼀遍。
正所謂:兩權相害取其輕 。隨着軟硬件的飛速發展,解釋運行的時間和編譯后再運行的時間差會越來越小,而python語言的“優雅”、“明確”、“簡單”的優勢也日趨明顯。
2:強類型語言vs弱類型語言
強類型語言:簡單理解不允許不同類型相加。優點是:能夠享受代碼提示功能,能夠在編譯期發現更多錯誤。
C#是強類型語言,python也是強類型語言。我家門前有兩棵樹,一棵是棗樹,另一棵還是棗樹。--魯迅
即便如此還是有區別的。C#中的“變量”在開發時的類型便是明確的:String便是String,Int32就是Int32,當然C#也有var 或者Object這些類似弱類型變量,但是定義變量的時候必須確定類型;python變量定義時候不需要指明類型,可以先給其賦值為整形,再賦值成字符串類型。這種區別其實是靜態語言和動態語言的區別。名可名,非常名。
二、python 特色
1:基礎數據類型:
python中最大的特點就是靈活(不用事先聲明)、可嵌套。
2:解包
2.1 左右個數相等
name, age, date = ['aaron', 20, '2020-02-02']
print(name) #輸出結果 aaron ; print(age) #輸出結果 20; print(date) #輸出結果 2020-02-02
2.2 左邊個數小於右邊
name, *age, date = ['aaron', 15,17,18,20, '2020-02-02']
print(name) #輸出結果 aaron; print(age) #輸出結果 [15, 17, 18, 20]; print(date) #輸出結果 2020-02-02
2.3 總結
- 自動解包支持一切可迭代對象
- python3中,支持更高級的解包操作,用星號操作使得等號左邊的變量個數可以少於右邊迭代對象中元素的個數。
- 特別是函數調用時,可以用 * 或者 ** 解包可迭代對象,作為參數傳遞。相當於可變參數。
2.4 區別
函數可變參數,區別C#中可以通過關鍵字params,但是使用程度遠不及Python中普遍。
在C#中區分兩個函數是否相同是根據方法簽名,方法簽名包括方法名+參數列表。也就是方法名相同,參數列表不同,叫做重載。例如兩個求和方法:sumFun(int a,int b),sumFun(int a,int b,intc) 在調用時,根據方法簽名進行匹配調用。sumFun(1,2) 和 sumFun(1,2,3)。
在python中,如果定義兩個同名方法 def sumFun(a,b),def sumFun(a,b,c)。后面的會直接把前面的覆蓋掉。調用的時候sumFun(1,2),會報錯。內容大致為:sumFun方法缺少參數c。
3:函數
3.1 函數名可以當做參數傳遞,當做結果返回
C#中委托(Delegate) 是存有對某個方法的引用的一種引用類型變量。可參考博客C#委托
Python中函數名其實是內存地址。函數即變量。可以非常容易的進行傳遞,可參考博客變量與函數
4:類和對象
C#和Python都是面向對象。首先定義一個類,然后通過對象實例化。進而對象可以調用類的相應方法。

using System; namespace HelloWorldApplication { class Person { public string name; // 名字 public int age; // 年齡 //定義構造函數 public Person(string name, int age) { this.name = name; this.age = age; } public void sayHi(){ Console.WriteLine("Hi,我是: {0},我今年{1}", name,age); } } class PersonTest { static void Main(string[] args) { Person p1 = new Person("張三",20); p1.sayHi(); } } }

class Person: # 定義構造方法 def __init__(self, name, age): self.name = name self.age = age def sayHi(self): print("Hi,我是: %s,我今年%s" %(self.name,self.age)) # 調用 p = Person("張三",18) p.sayHi()
C#中定義類的時候需要聲明該類相應的屬性並指定數據類型,並且通過構造方法(方法名和類名一樣)給屬性賦值;Python中也是先調用__new__構造方法,然后通過__init__初始化方法給進行相應賦值。
C#在對象初始化的時候通過new 類名(數據類型必須跟構造函數一致)。Python中不需要使用new 關鍵字。
現在發現,只有年齡是不夠的,需要加上這句話是哪一年說的。那么C#的類修改起來就比較麻煩了。Python類不用做調整,只需要在調用處對方法進行修改即可

class Person: # 定義構造方法 def __init__(self, name, age): self.name = name self.age = age def sayHi(self): print("Hi,我是: %s,我今年%s" %(self.name,self.age)) # 調用 p = Person("張三",18) p.Year=2020 def sayHi(self): print("Hi %s,我是: %s,我今年%s" % (self.Year,self.name, self.age)) p.sayHi=sayHi p.sayHi(p) #Hi 2020,我是: 張三,我今年18 p2 = Person("李四",20) p2.sayHi() #Hi,我是: 李四,我今年20
微觀對比
一、數據類型
1:基本數據類型
1.1 數字類型
1.1.1 整型的除法

c# 中的除法 int a = 39/8 ; //a 4 python 中的除法 取全值 a = 39/8 ; #a 為 4.875 取商 a2 = 39//8 ; #a2 為 4 取余 和C#中一致 a3 = 39%8 ; #a3 為 7 冪運算 a4 = 2 ** 5; #a3 為 2*2*2*2*2=32
1.2 字符串
1.2.1 字符串表示方法

C#中 "" 用雙引號如("我是字符串") Python中 "我是字符串" '我是字符串' """我是字符串""" '''我是字符串'''
1.2.2 字符串可以做乘法,表示多次輸出

n1 = "Aaron" n2 = n1 * 10
1.3 列表

C# 中 只能指定某一個數據類型 List<string> listStr = new List<string>(); C# 中的數組 int[] numbers = new int[5] {1, 2, 3, 4, 5}; python 適用於多種類型 li=[1,12,19,"name",["張三",["18",21]"李四"],"Aaron",True]; #中括號擴起來,,分割.比C#和Java中強大 list
1.4 強制類型轉換

C#中強制類型轉換是:新變量=(類型)變量 double d = 5673.74; int i; // 強制轉換 double 為 int i = (int)d; python 中強制類型轉換是:新變量=類型(變量) i = int("123")
2:其他數據類型
PS:更多關於基本數據類型可參考基礎之運算符與數據類型
二、語法
1:基礎語法
1.1 語句結束符
C#每句結尾需要;分割。python中可以以;分割,也可以以換行符分割。
1.2 注釋

1.3 邏輯運算符
分別是運算符號的不同,變量值的類型不通過
python中的與、或、非分別是 and、or、not。示例:a and b。
python中的變量值可以是布爾類型,也可以是字符串等其他類型。具體細節可參考Python基礎之運算符與數據類型
C# 中的與、或、非分別是 &&、||、! 示例:a && b。
C# 中的變量值只能是布爾類型。
1.4 循環
1.4.1 while循環
while 可以加else

while 條件: print("ok") else: print("結果")
1.4.2 for循環

v = range(5) for item in v: print(item); # 輸出結果 # 0 # 1 # 2 # 3 # 4 # 輸出結果
三、具體功能對比
1:文件讀寫操作
C#中文件讀取
java中文件讀取
python中文件讀取
2:網絡數據采集操作
例如同一個功能,查看博客園中,我都寫了哪些隨筆,都是什么時間寫的.做一個數據的采集分析。
C#中數據采集
python中數據采集 ps:python中可以利用Scrapy框架,更便捷進行數據分析