Posted on 2006-03-09 20:31
shaofan 閱讀(1041)
評論(0) 編輯 收藏 所屬分類:
Python
我有一個習慣,每次學門語言,總要自己寫個List或Stack并加上Unit Test來試試。這次對Python也不例外。總體感覺有以下幾點
1.這是我用過的唯一一個把代碼行的縮進也做為語法的語言,就因為不正確的縮進,我的第一個Python程序讓我吃盡了苦頭。事情是這樣的,我運行測試時,報告每次都說"Ran 0 test in 0.000s",找了半天,也找不出為什么只運行了0個測試,一直以為是unittest包的用法有問題,或我的語法有問題,直到花了大半個小時翻書,又對比其他的測試程序以后,才發現,天啊,原來是因為最后一行的縮進多縮了一層,被認為與上一個方法同一個block。
2.雖然在縮進上吃了苦頭,但是代碼看起來確實相當整潔清楚,感覺比java的動不動一堆大括號相比,實在多了。
3.Python的每個module(可以看作與java的包類似)都可以包含方法和類,而java的所有方法都要寫在類里,包里只有類,這點相當不同。
4.因為Python是用c實現的,它的命名比較簡單,使用很多縮寫,與java的長長一串的命名是很強烈的對比
5.Python是動態類型的語言,變量不需聲明類型可以直接使用,雖然方便,但缺點也很明顯,那就是變量的類型信息不見了,經常搞不清楚方法的參數要傳入什么,返回什么,挺不習慣的。
6.就因為缺少類型信息,Python的文檔也沒有Java的可讀性強。比如java的 String foo(int a)一看就知道傳入整形返回字符串,換成Python就變成了 foo(a),只能讀文檔才能搞清楚了。可能我還沒習慣的原因吧,感覺有時文檔對它們的類型也說的不太清楚。
總體感覺Python一些風格像C。寫起代碼來,感覺很快,很清楚,還是很不錯的 I love the feeling :)

看看我寫的Stack
1 #!/usr/bin/python
2 # -*- coding: cp936 -*-
3 #Filename:stack.py
4
5 import unittest #引用兩個模塊,每個模塊實際都是一個py文件
6 import testhelper #本文件也可看作一個模塊,可以被引用
7
8 #Stack definition
9 class Stack2: #行首縮進和冒號代替了大括號{}
10
11 def __init__(self, initCap, values=[]): #構造方法,values默認值為空列表
12 self.capacity=initCap #表明capacity是一個實例變量
13 self.elements=values
14
15 def pop(self): #self參數表明它是實例方法(非static)
16 size = len(self.elements)
17 if size==0:
18 raise Exception() #拋出一個異常
19 else:
20 result = self.elements[ size-1 ]
21 del self.elements[size-1]
22 return result
23
24 def push(self,value): #關鍵字def用來定義一個方法
25 size = len(self.elements)
26 if( size>=self.capacity ):
27 raise Exception()
28 else:
29 self.elements.append(value)
30
31 def size(self):
32 return len(self.elements)
33
34
35 #Unit test of Stack2
36 class TestStack( unittest.TestCase ):
37 def test(self):
38 #test empty stack construction
39 self.stack=Stack2(3)
40 self.assertEquals( 0, self.stack.size() )
41 self.assertRaises( Exception, self.stack.pop ) #pop方法作為參數傳入
42
43 #push elements into it
44 self.stack.push(1)
45 self.stack.push(2)
46 self.stack.push(3)
47 self.assertRaises( Exception, self.stack.push, 4 )
48 self.assertEquals( 3, self.stack.size() )
49
50 #now pop the elements
51 self.assertEquals( 3, self.stack.pop() )
52 self.assertEquals( 2, self.stack.pop() )
53 self.assertEquals( 1, self.stack.pop() )
54 self.assertRaises( Exception, self.stack.pop )
55 self.assertEquals( 0, self.stack.size() )
56
57
58 #run test
59
60 if __name__=='__main__': #判斷是否被引用
61 testhelper.runTest( TestStack ) #只在不是被引用的情況下才執行
62