Posted on 2006-03-09 20:31
shaofan 阅读(1035)
评论(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