Posted on 2006-03-09 20:31
shaofan 閱讀(1041)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
Python

我有一個(gè)習(xí)慣,每次學(xué)門(mén)語(yǔ)言,總要自己寫(xiě)個(gè)List或Stack并加上Unit Test來(lái)試試。這次對(duì)Python也不例外??傮w感覺(jué)有以下幾點(diǎn)
1.這是我用過(guò)的唯一一個(gè)把代碼行的縮進(jìn)也做為語(yǔ)法的語(yǔ)言,就因?yàn)椴徽_的縮進(jìn),我的第一個(gè)Python程序讓我吃盡了苦頭。事情是這樣的,我運(yùn)行測(cè)試時(shí),報(bào)告每次都說(shuō)"Ran 0 test in 0.000s",找了半天,也找不出為什么只運(yùn)行了0個(gè)測(cè)試,一直以為是unittest包的用法有問(wèn)題,或我的語(yǔ)法有問(wèn)題,直到花了大半個(gè)小時(shí)翻書(shū),又對(duì)比其他的測(cè)試程序以后,才發(fā)現(xiàn),天啊,原來(lái)是因?yàn)樽詈笠恍械目s進(jìn)多縮了一層,被認(rèn)為與上一個(gè)方法同一個(gè)block。
2.雖然在縮進(jìn)上吃了苦頭,但是代碼看起來(lái)確實(shí)相當(dāng)整潔清楚,感覺(jué)比java的動(dòng)不動(dòng)一堆大括號(hào)相比,實(shí)在多了。
3.Python的每個(gè)module(可以看作與java的包類(lèi)似)都可以包含方法和類(lèi),而java的所有方法都要寫(xiě)在類(lèi)里,包里只有類(lèi),這點(diǎn)相當(dāng)不同。
4.因?yàn)镻ython是用c實(shí)現(xiàn)的,它的命名比較簡(jiǎn)單,使用很多縮寫(xiě),與java的長(zhǎng)長(zhǎng)一串的命名是很強(qiáng)烈的對(duì)比
5.Python是動(dòng)態(tài)類(lèi)型的語(yǔ)言,變量不需聲明類(lèi)型可以直接使用,雖然方便,但缺點(diǎn)也很明顯,那就是變量的類(lèi)型信息不見(jiàn)了,經(jīng)常搞不清楚方法的參數(shù)要傳入什么,返回什么,挺不習(xí)慣的。
6.就因?yàn)槿鄙兕?lèi)型信息,Python的文檔也沒(méi)有Java的可讀性強(qiáng)。比如java的 String foo(int a)一看就知道傳入整形返回字符串,換成Python就變成了 foo(a),只能讀文檔才能搞清楚了??赡芪疫€沒(méi)習(xí)慣的原因吧,感覺(jué)有時(shí)文檔對(duì)它們的類(lèi)型也說(shuō)的不太清楚。
總體感覺(jué)Python一些風(fēng)格像C。寫(xiě)起代碼來(lái),感覺(jué)很快,很清楚,還是很不錯(cuò)的 I love the feeling :)

看看我寫(xiě)的Stack
1 #!/usr/bin/python
2 # -*- coding: cp936 -*-
3 #Filename:stack.py
4
5 import unittest #引用兩個(gè)模塊,每個(gè)模塊實(shí)際都是一個(gè)py文件
6 import testhelper #本文件也可看作一個(gè)模塊,可以被引用
7
8 #Stack definition
9 class Stack2: #行首縮進(jìn)和冒號(hào)代替了大括號(hào){}
10
11 def __init__(self, initCap, values=[]): #構(gòu)造方法,values默認(rèn)值為空列表
12 self.capacity=initCap #表明capacity是一個(gè)實(shí)例變量
13 self.elements=values
14
15 def pop(self): #self參數(shù)表明它是實(shí)例方法(非static)
16 size = len(self.elements)
17 if size==0:
18 raise Exception() #拋出一個(gè)異常
19 else:
20 result = self.elements[ size-1 ]
21 del self.elements[size-1]
22 return result
23
24 def push(self,value): #關(guān)鍵字def用來(lái)定義一個(gè)方法
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方法作為參數(shù)傳入
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 ) #只在不是被引用的情況下才執(zhí)行
62