集合對象
任何一門語言的集合對象都是重中之重,一般包括固定數組,可變數組,字典 (hashtable),還有其他一些特殊集合,.net裡System.Collection以 System.Collection.Specialize下的類,Java中Java.util.Collections包中的類就是與此相關.另外, 這兩種環境中的數組都為固定長度數組,但是也同時提供可變長度的列表類ArrayList(兩種環境都叫這個名字).
而php中,數組和字典混合了起來,也就是說,即可以通過順序方式訪問,也可以為數組的每個元素設定一個key
那麼python裡面的集合類是怎麼使用又具有什麼特點呢?
Lists(列表類):
這個類可以類比為.Net和java中的ArrayList,是一個可變長度,沒有類型約束的數組;
myTags=['a','aa','b','A','啊'],這個語句建立了一個列表對象,並賦予了初始值,注意這裡初始值用中括弧[]括起來,後面還有其他的集合類型,他們的符號稍微不同,千萬小心
下面的語句往剛剛初始化的數組中添加一個整數類型的對象
myTags.append(0),這個語句吧0這個整數加入到列表中去
與之對應的刪除一個元素的方法為Remove,比如下面語句把內容為b的元素刪除
myTags.remove('b'),注意如果list中有兩個內容為b的元素,remove方法會刪除序號小的那個,而如果列表中麼有內容為"b"的元素,那麼會報錯
myTags[0]="abc",把這個列表的第一項修改為"abc",注意這裡數組還是從0開始,而不像VB和Fortran(沒聽說過?有代溝...)是從1開始的.
列印這個列表的方法非常簡單
print myTags
輸出結果為:
['a', 'aa', 'b', 'A', u'\u554a',0]
不用進行任何迴圈,呵呵,方便吧,更強大的功能還在後面
我們還可以為對list對象進行排序,
myTag.sort()
上面的語句執行結果是
>>> print myTags
[0, 'A', 'a', 'aa', 'b', u'\u554a']
可以看出排序是按照ascii碼錶的對應順序來的,中文被轉化為unicode表示顯示並排在最後,.net和java裡都有這個功能,實現各有不同,參看下面的翻轉列表
- 反轉列表
通過myTags.reverse()這個方法,我們就可以把列表翻轉,再次列印,輸出結果為
[u'\u554a', '{', 'b', 'aa', 'a', '\\', 'A', 0]
這個方法.net的ArrayList也有提供,而java中用通過Collection類的reverse靜態方法操作一個集合對象來實現如 ArrayList list=new ArrayList(),Collection.reverse(list),這個類同時也提供了排序,獲得最大/小值,拷貝,迴圈等等方法,但是這個實用的類卻常常被忽略,嗚呼哀哉!
- 其他方法
list類還有學多方法,包括用count屬性查看列表長度,pop彈出指定位置的資料,我們就不一一講解了,有興趣的可以通過dir命令查看List對象具有的方法
Tuple(不變列表)
這個類的名稱對.Net和Java的程式員很不直觀,沒有對應的名詞,但是他的概念其實很簡單,即一旦建立就不能改變,雖然Tuple沒有公開的方法來增加元素,但是通過一些內建方法,我們仍然可以做到這點
- 建立Tuple
myTuple=('Field','Method','Class') 是不是很類似於.net中數組的聲明和初始化string[] myTags ={ ".Net", "DataBase", "Python" };
注意這裡用原括弧(),而不是中括弧,也不是.net中申明數組的大括弧{}
- Tuple在輸出語句中的用法
print '%s is %d years old' % (name, age),這個語句把姓名和年齡按照順序填到字串的置頂位置,然後輸出,用過c語言的人對%s,%d肯定不陌生,一個置頂內容為字串,一個指定內容為數字.後面那個%d也可以寫成s%,實際上所有的情況你都可以寫成%s,讓python自己來搞定轉換工作,但是寫出正確的類型可以杜絕下面的情況,比如你的程式有錯誤,不小心往年齡裡添了個字串,這是運行到這裡代碼就報錯了.
.net裡面實現這個功能類似的文法是這樣來做 Console.WriteLine("'{0} is {1} years old",name,age),可以看到.net要靈活一些,後面的name和age不一定要按照順序給出,比如Console.WriteLine ("'{1} is {0} years old",age,name)和上面的語句有同樣的效果