剛學Python不久,因為自己的工作主要是使用.NET,所以很多思考的東西都會和C#相關。特別是在理解上,總愛和C#比較進行看看有什麼區別
Array 和Tuple
Tuple在Python中定義成不可變的List,我的直覺理解就是一個Array(但這個很奇怪,Python中有一個標準模組就是Array,暫時沒用過,以後再具體分析吧)。
對於Tuple來說初始化的方式很奇怪
userid=1,2,3,4,5
或者
userid=(1,2,3,4,5)
兩者得到的結果是一樣的。想這種userid=1,2,3,4,5 C#是肯定通不過的,而這種做法反而像C#的int a,b,c,d,但這表示的定義多個int的資料類型。
沒有了開始和結尾的“{}”
C#的函數,類的定義...等都會出現這個符號。Python改為以縮排和冒號的方式來代替代碼塊。寫多了Python你會發現這確實是個很美的事情。因為C#編寫時本身代碼規範就強調要縮排。現在把{}都去掉了,少敲了不少鍵盤啦。
函數預設參數
發現這個也是很折騰人的東西。因為和C#的確有不少的區別
1:Python的函數可以定義預設值,這個感覺像MSSQL的預存程序
2:Python的函數還可以使用關鍵字參數
def Get(name,id,age)
pass
Get(name='333',id=1,age=444)
引用《簡明Python》中的說法
“這樣做有兩個 優勢 ——一,由於我們不必擔心參數的順序,使用函數變得更加簡單了。二、假設其他參數都有預設值,我們可以只給我們想要的那些參數賦值。”,這一點,的確比C#方便不少。
函數的可變參數
Python:
def fprintf(*args):
for i in args:
print i
fprintf(1,2,3,4,"ssss")
在C#中會這樣定義
public static void UseVariableParameters(params int[] list) { for ( int i = 0 ; i < list.Length ; i++ ) { Console.WriteLine(list[i]); } Console.WriteLine(); }
如果單純從這上面看沒什麼優勢,但Python 同時支援List、Tuple、Dictionary 作為參數一次傳入。 List、Tuple的參數是以 *arg傳入的。Dictinary是以**arg傳入的。
>>>args = [3, 6]
>>> range(*args)
>>> def parrot(voltage, state='a stiff', action='voom'):
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
這個只能說Python的文法太靈活啦
For IN 形式的迴圈
這個也很有意思,我發現在Python中已經沒有了以前學習的語言中的for(int i;i<cout;i++)這種形式了。使用了For i in range(10) 這種方式,的確是個進步。而且C#也通過Linq的方式類比了這個實現
過濾類別文法
很Cool
[mapping-expression for element in source-list if filter-expression]
>>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
>>> [elem for elem in li if len(elem) > 1]
C#的Linq現在也可以實現這個功能,但還是Python比較Cool ,和簡單
and 和 or 的特殊性質
Python中and 和or 左右返回的不是bool而是相應的結果。
and 如果為假返回and左邊的值,如果為真返回右邊的值
or 返回第一個為真的值,如果都是假返回最後一個值
但這樣確有一個C#沒有的好相關,相當於一個二元操作符了。
在C#中經常這樣寫三元操作符和
string name;
name = String.ISNullOrEmpry(name)?String.Empty: "username is:" + name
而如果C#也支援Python的這種概念的話就可以簡單寫出
name = name and "username is :" + name
很希望C#能支援類似的文法
list對象的分區 (slice) 和 Copy
具體不多說,只是覺得比C#的list用起來方法,特別是希望.NET 以後可以支援這個文法
shoplist[:5] 返回序列的一段返回內的值
shoplist[:]返回整個序列的Copy