2009年7月9日 星期四

Python的基本集合(collection)型態

翻譯作集合(collection)好像蠻弔詭的,因為工程的人很習慣把他們當作set,anyway~
基本上python支援三種(不管是2.6 or 3.0),分別是tuple, list, map

基本上這三種就相當的夠用了,其實也只有兩種,tuple可以看成constant list,不變的list
如果有學過其他程式語言,就更單純了,把list視為list或者動態array,把map當成hash
一切就很自然了

hair = "black", "brown", "blonde", "red"
hair[2]

上面宣告了一個tuple,存取的方式就是使用[]運算子來取得,上面的例子hair[2]就是blonde囉

list基本上跟tuple差不多,差別是,你不能去改變tuple的內容,但是list可以,list有幾種基本運算
宣告空的list就是list=[],夠簡單吧
list.append(x) 在list尾端加入x
list.count(x) 計算list中x元素的個數
list.extend(x) 跟append差不多
list.index(x,start,end) 在[start,end)搜尋元素x,如果找到回傳index,沒找到會丟出例外
list.insert(index,x) 在index之後插入x
list.pop() 取出list最後一個元素,並且回傳他
list.pop(index) 取出list最後一個元素,並且回傳他
list.remove(x) 刪除x元素
list.reverse() 將list反向排列
list.sort() 排序list的內容

如果有基本資料結構的概念就知道,list可以輕易的做到array, list, stack, queue這幾種資料結構
當然,如果你是實際講求效能的,可能就會懷疑[]這運算子是否為O(1)的時間等等,這倒是我不知道的,如果知道的網友,請告訴我,謝謝
那二維陣列呢?多維度陣列呢?這是很幸運與不幸的事情,幸運的是,只要用簡單list在包含list就可以了,比方說list[5]=[],這樣子,同時你也看到一個問題了,他並不保證list元素中是list,也不保證list中的list長度一致,這就是script language的特色吧

最後看到map型態,就把它當作hash table來操作吧,使用{}來宣告空map,裡面的元素key:value使用分號來分開,如同範例
d = {"root": 18, "blue": [75, "R", 2], 21: "venus", -14: None,"mars": "rover", (4, 11): 18, 0: 45}


這裡也再度看到script language的特色,他並不要求你key是相同型態,也不要求value是相同型態,這同時有好處也有壞處
基本的操作有
map.clear() 清空map
map.copy() 複製map
map.items() 取出所有key,value的pair
map.keys() 取出所有的key
map.values() 取出所有的value
通常讀取map會直接用map[key],新增會用map[key]=value
至於拜訪的方式,晚點再寫吧

2009年3月31日 星期二

Python IDE

一直想要有一款輕盈的IDE,當然其中我認為比較成熟的IDE有eric IDE, eclipse+plugin, NetBeans+plugin,有不少IDE是基於python的,現階段python 3.0剛推出,很多IDE因為這樣不能用orz

eric IDE要編譯QT(M$下)很麻煩,eclispe跟Netbeans啟動都不算快,所以囉,最好找到一款ulipad,感覺還可以,目前正在適應中

2009年3月28日 星期六

Python

最近又開始看重複的看ruby跟python,我實在是個半弔子,我對兩者都不熟悉,不過根據最近的一些觀察,我想我會傾向python,尤其常常在linux底下看到python開發的東西

先說說python吧,這的是一個頗為弔詭的東西,他的語法有強烈的限制性,不過發明的人應該覺得維護性的重要性比較重要,不想要一個語言有千百種寫法。另外一個印像是他有眾多lib,這一點我蠻喜歡的。另外一個詭異的是,這麼不錯的一個語言,竟然缺乏一個良好的IDE,簡直叫人難以接受,一個功能比較齊全的IDE竟然要自行編譯QT等等的才能在M$底下執行(在linux底下就簡單多了)。再加上目前是2.0跨向3.0(很多東西不相容),所以資料跟一些lib有點銜接不上來。種種的現象都叫我很不能"接受"

再回頭看看ruby,他class定義的確顯的蠻幽雅(看看那些java的reader/writer method真的有點orz),也有不錯的IDE,可是他的lib相對於python比較少,資料結構的資源好像也不是那麼多,可是ruby on rails這部分又是比python好。

兩相比較下,python給我的驚奇比ruby多,因為一些功能性上來說,python顯的比較完備(我想拿python來做些簡單程式開發,不大需要RoR的東西,所以Ruby的吸引力比較小),於是我決定進入python的世界,可是如果單單就受歡迎性,ruby因為有RoR的加持,再加上目前很多人再開發web application,ruby聲勢顯的比python大,這也有可能造成以後ruby補完之後擠掉python,呵呵

會想要學習python之類的東西也很簡單,因為目前硬體已經發展到這種程度,程式的開發時間遠大於執行時間,如果在單單驗證想法跟一些簡單的功能上面,script language已經比C/java之類來的簡單。或許python之類的執行能力比C/java之類來的差,可是開發可即刻執行的優點超越了他們。另外script language有個很大的缺點就是,大多沒有特定的GUI,這會讓開發應用程式上面有蠻大的"障礙",因為等於要去銜接某種GUI lib,這在開發上比較吃虧(這一點java就做的很好)

anyway~沒有哪種語言比較好,只是有時殺雞不用牛刀,挑一種適合的程式語言去解決人們碰到的問題才是王道~呵呵