我的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 

你可能感兴趣的:(我的Python初体验)