follow my heart...
分类: Python/Ruby
2006-09-18 08:46:01
[点评:python是优秀的,优秀的原因在于他强大的可扩展性以及简单易用.在脚本语言的世界里,python是绝对的霸主.]
Python概要
Python是一门解释性的、面向对象的、动态语义特征的高层语言。它的高层次的内建数据结构,以及动态类型和动态绑
定,这一切使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的部件。Python的简单而易于阅读的语法强调了可读性,因此降低了程序维护的
费用。Python支持模块和包,并鼓励程序模块化和代码重用。Python的解释器和标准扩展库的源码和二进制格式在各个主要平台上都可以免费得到,而
且可以免费分发。
Python作为一种功能强大且通用的编程语言而广受好评,它具有非常清晰的语法特点,适用于多种操作系统,目前在国际上非常流行,正在得到越来越多的应用。
下面就让我们一起来看看它的强大功能:
Python(派森),它是一个简单的、解释型的、交互式的、可移植的、面向对象的超高级语言。这就是对Python语言的最简单的描述。
Python有一个交互式的开发环境,因为Python是解释运行,这大大节省了每次编译的时间。Python语法简单,且内置有几种高级数据 结构,如字典、列表等,使得使用起来特别简单,程序员一个下午就可学会,一般人员一周内也可掌握。Python具有大部分面向对象语言的特征,可完全进行 面向对象编程。它可以在MS-DOS、Windows、Windows NT、Linux、Soloris、Amiga、BeOS、OS/2、VMS、QNX等多种OS上运行。
编程语言
Python语言可以用来作为批处理语言,写一些简单工具,处理些数据,作为其他软件的接口调试等。Python语言可以用来作为函数语言,进 行人工智能程序的开发,具有Lisp语言的大部分功能。Python语言可以用来作为过程语言,进行我们常见的应用程序开发,可以和VB等语言一样应用。 Python语言可以用来作为面向对象语言,具有大部分面向对象语言的特征,常作为大型应用软件的原型开发,再用C++改写,有些直接用Python来开 发。
数据库
Python在数据库方面也很优秀,可以和多种数据库进行连接,进行数据处理,从商业型的数据库到开放源码的数据库都提供支持。例如: Oracle,Ms SQL Server等等。有多种接口可以与数据库进行连接,至少包括ODBC。有许多公司采用着Python+MySql的架构。因此,掌握了Python使你 可以充分利用面向对象的特点,在数据库处理方面如虎添翼。
Windows编程
Python不仅可以在Unix类型的操作系统上应用,同样可以在Windows系统里有很好的表现。通过添加PythonWin模块,就可以 通过COM形式调用和建立各种资源,包括调用注册表、ActiveX控件以及各种COM等工作,最常见的例子就是通过程序对Office文档进行处理,自 动生成文档和图表。
通过Python,还可以利用py2exe模块生成exe应用程序。还有许多其他的日常维护和管理工作也可以交给Python来做,从而减少维 护的工作量。利用Python,你还可以开发出象VB,VC,Delphi那样的GUI程序,但却可以在多个平台上执行。这在许多方面并不逊色于 Java。
多媒体
利用PIL、Piddle、ReportLab等模块,你可以处理图象、声音、视频、动画等,从而为你的程序添加亮丽的光彩。动态图表的生成、 统计分析图表都可以通过Python来完成。另外,还有OpenGL。利用PyOpenGl模块,你可以非常迅速的编写出三维场景。
科学计算
Python可以广泛的在科学计算领域发挥独特的角色。有许多模块可以帮助你在计算巨型数组、矢量分析、神经网络等方面高效率完成工作。尤其是在教育科研方面,可以发挥出独特的优势。
网络编程
Python可以非常方便的完成网络编程的工作,提供了众多的解决方案和模块,可以非常方便的定制出自己的服务器软件,无论是c/s,还是b/s模式,都有很好的解决方法。
工具集:
Soket编程
CGI,Freeform
Zope,CMF,Plone,Silva,Nuxeo CPS...
WebWare
Twisted
CherryPy
SkunkWeb
Quixote
4Suite Server
Spyce
Albatross
Cheetah
mod_python
协议:
http
ftp
gopher
XML-PRC
SOAP
POP
SMTP
图形用户界面
Python可以非常方便的实现GUI编程,通过Tkinter,wxPython,QT等等模块,你就可以根据需要编写出强大的跨平台的用户界面程序。
开发环境与编辑器
Python程序的开发工具比较多,目前主要的工具既有IDLE,PythonWin这样的免费工具,也有一些商业性的工具。通过这些工具,可以让你更为快速的完成工作。
集成开发环境(IDE):
IDLE:这是Python里边自带的,基本上可以满足一般开发需要,请参考cnIDLE。
PythonWin:这是基于Windows平台的编辑开发环境,基本上可以满足一般开发需要。
PythonWorks Pro
Wing IDE
Komodo
代码编辑器:
LEO:完全由Python编写的程序代码编写辅助工具,可运行在多种操作系统中,支持独特的程序代码管理方式。
gVim:相当专业的代码编辑器,可运行在多种操作系统中,支持Python扩展。
Emacs:Unix系统中常用的工具。
SciTE:简单易用的代码编辑器,支持unicode编辑。
嵌入和扩展
Python可以嵌入到其它应用程序中,也可以通过C/C++编写扩展模块,从而可以提高程序的运行速度或者完成只有通过C/C++才能完成的 工作。现在Python已经可以和C#相结合,并且结合到Visual Studio里边,实现微软的.Net思想。如果你会C语言,再学习Python,这将是一个非常棒的一种选择。
如果你掌握了Python,想在Java里应用它,你可以采用Jython。Jython是采用Java语言实现的Python。这样,你 只要按照Python的语法,就可以调用Java的各种类库,快速的编写出基于Java的程序。也就是通过Jython,编写Java程序。这样就可以更 为快速的实现Java的功能。Python在面向对象方面和Java是相通的。
除了c/c++和java, Python目前还可以和Delphi、VB结合。
游戏编程
Python在很早的时候就是一种游戏编程的辅助工具。在《星球大战》中扮演了重要的角色。在“阿贝斯(Abyss)”、“星球之旅(Star Trek)”、“Indiana Jones”超级大片中担当特技和动画制作的工业光魔公司(Industrial Light)就采用Python制作商业动画。目前,通过Python完全可以编写出非常棒的游戏程序。
企业与政务应用
目前,Python已经成功的实现企业级应用,在全球,已经有很多公司采用Python进行企业级软件的开发和应用,比如:ERP和CRM这样的应用。同时,通过Python技术,成功的实现了许多政务应用。
用Python写的较大的系统有:
Zope:一个应用程序服务器,具有内容管理、团队开发、XML、面向对象、SOAP接口等一系先进特性,且开放源码。参见:。
Gadfly:一个用Python写的面向对象关系型数据库,具有小巧、快速、可移植性好,具有大部分SQL语言特性,且开放源码。参见。
还有一些比较有名的公司也在用Python进行原型的开发,如Microsoft、IBM等,还有:
红帽(Red Hat )曾用Python和Tk一起成功开发配置和管理操作系统的可视界面。整个系统可以全面控制Linux操作系统,并根据用户选择对配置文件作自动更新。
Infoseek在其公用搜索引擎使用了Python。该公司还用Python对其软件进行定制,使最终用户能对该网站内容进行方便下载。
通常,程序员爱上Python是因为它能增加生产力。由于没有编译过程,编辑-测试-调试周期相当快。调试Python程序很简单:一个错
误永远不会导致一个段错误。当解释器发现错误时,它就引发一个异常。当程序没有捕捉到异常,解释器就打印一个堆栈跟踪。一个源码级调试器允许我们检查局部
和全局变量,计算表达式,设置断点,单步跟踪等等。调试器是用Python写的,这证明了Python的能力。另外,最快的调试程序的方法是增加几条打印
语句:快捷的编辑-测试-调试周期使得这个简单的办法十分有效。
基本的运算式
我们直接切入正题,直接简单的教你使用 Python。 我假设读者己有其它语言的基础,可以直接切入语法重点。
1 a = 0
2 b = 7
3 a = a + 1
4 a = b * a
5 print a
结果显示 : 7
上面就是 python 的简单例子,相信如果你学过其它的语言(如 C/C++, Java),就能很容易的了解。
A+B A 加 B
A-B A 减 B
A*B A 乘 B
A/B A 除 B
A%B 取 A/B 的馀数(如 8 % 3 == 2)
-A 取 A 的反数( 若 A == 7, -A == -7)
String
1 a = 'hello'
2 b = "world"
3 c = a + ' ' + b + '!!'
4 print c
结果显示 : hello world!!
string 可以使用 ' or " 符号括起来表示。在行 3,是合并四个 string object 的例子, 将四个 string 依顺连接成单一的 string。
1 a = '%s=%d' % ('test', 16)
2 print a
结果显示 : test=16
类似於 C/C++ 的 printf 或 sprintf,在行 1,python 提供 string format 的功能。 字串 '%s=%d' 指定 string 的 format,而後在字串後接着 % 然後是 format 的参数, 这些参数会依序取代 format 里的 %s 和 %d。%s 代表要取代字串,%d 则是取代成整数。
a = 'This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
Note that whitespace at the beginning of the line is\
significant.\n'
string 可以延伸到数行,但在每一行的最後必需要有escape \ 以忽略掉 newline。 另外也可以使用 """ 或 '''
a = '''This is a rather long string containing
several lines of text just as you would do in C.
Note that whitespace at the beginning of the line is
significant.'''
使用 ''' 或 """ 就不需要在每一行结数时 escape,但 newline 会被包含入 string 内容。
List
1 a = []
2 a[0] = 'aoo'
3 a[1:3] = [10, 11]
4 b = [1, 2, 3, 'foo']
5 print a, b, b[:3], b[1:]
结果显示 : [9, 10, 11] [1, 2, 3, 'foo'] [1, 2, 3] [2, 3, 'foo']
上面是 list 的使用范例。list 是一个 sequence data type, 类於 C/C++ 的 array, 但 array 是 fixed length 而 list 不是, 其长度是可以随时改变的。行 1 就 bind a 为一个空的 list。 行 2 则指定 index 0 为 'aoo' string object。行 3 为 list 的 slice 的使用范例。 将 index 1 和 index 3 之间的 item(index 1 和 2) 代换成 10 和 11。行 5 的 b[:3] 则相当於 b[0:3], 而 b[1:] 相当於 b[1:4]。list 内的 item 不需是相同的 type, 如上例在一个 list object 里可以同时包含整数和 string 不同 type 的 item。
1 a = [1, 2, 3] + [4, 5, 6]
2 print a
结果显示 : [1, 2, 3, 4, 5, 6]
和 string 一样,list 也可以进行合并的动作(concatenate)。
slice
1 a = [ 1, 2, 3, 4, 5]
2 print a[3], a[3:], a[:2], a[:-1], a[-2]
结果显示 : 4 [4, 5] [1, 2] [1, 2, 3, 4] 4
index 可为负数,负数则从 list 的结束位置往回数。
list 的 index 可以比作下图,每一个 item 指 list 里的一个 object。而 | 则为 item 之间的分界, 其下方则为其 index。
| item 0 | item 1 | item 2 | .... | item n |
0 1 2 3 n n+1
-n -n+1 -n+2 -n+3 -1
当指定 item k (0 <= k < n+1), 则 index 设为 item k 的前一个分界 index k。 当指定 item k ~ item p (0 <= k <= p < n+1) 时,则 slice 指定为 [k:p+1] (意指 index k 和 index p+1 两个分界之间所有的 item) 或 [k:p-n](注: p < n, p - n < 0 为负数)。
Methods for List
1 a = []
2 a.append(1)
3 a.append(2)
4 a.insert(1, 3)
5 print a
结果显示 : [1, 3, 2]
上面是 list 的 append() 和 insert() 两个 method 的使用范例,append 用以新增一个 item 到 list 的最後面。 insert 用以在指定的位置插入一个新的 item。行 4即在 list 的 index 1 的位置(即 item 0 和 item 1 之间)插入一个新 item。
1 a = [1, 3, 2]
2 a.sort()
3 print a,
4 a.reverse()
5 print a
结果显示 : [1, 2, 3] [3, 2, 1]
sort() method 能将 list 进行从小到大的排序,reverse() method 则进行从大至小的反向排序。
string vs list
string 也和 list 同为 sequence data type,也可作 slice operator,但 string 为 immutable object,不可修改其内容。
1 a = 'hello world!!'
2 print a[-7:], a[:5]
结果显示 : world!! hello
1 a = 'hello'
2 print a[1]
结果显示 : e
string 也和 list 一样,可以 subscript (index) 其中的 item。python 并不像 C/C++ 般, python 并没有独立的 character type,string 的 subscripted item 为一长度为 1 的 string。
nested list
list 里的 item 可以为另一个 list object,成一个巢状的结构。
1 a = [ 1, 2, 3, ][ 'abc', 'cde', 3, 2], 5]
2 print a[3][1]
结果显示 : cde
1 a = [1, 2, 3]
2 print len(a)
结果显示 : 3
len() 函数传回 sequence type object 的 size。
tuple & multiple assignment
1 a = 'foo'
2 a, b, c = 9, 8, a
3 print a, b, c
结果显示 9 8 foo
行 2 称为 multiple assignment,可以同时指定多个变数的内容。
1 a = 1, 2, 3, 4, 5
2 b = 1, 2, a[:3]
3 print a, b
结果显示 : (1, 2, 3, 4, 5) (1, 2, (1, 2, 3))
行 1 bind name a 为 (1, 2, 3, 4, 5),python 定义为 tuple,同 string 为 immutable sequence data type, 不能改变 tuple object 的内容。a = 1, 2, 3, 4, 5 和 a = (1, 2, 3, 4, 5) 是相同的,称之为 tuple packing, 把 1, 2, 3, 4, 5 这几个 object 包成一个 tuple object。
1 a, b, c = 1, 2, 3
2 (e, f, g) = 5, 6, 7
3 print a, b, c, d, e
结果显示 : 1 2 3 5 6 7
上面的动作称之为 tuple unpacking,将等号右边的 sequence type object 解开成数个 object 和等号左边的 name 进行 bind。左边 tuple 的长度必需和右边的 item 数目相同。
1 a = 'hello'
2 a, b, c, d, e = a
3 print d, e, a, b, c
结果显示 : l o h e l
在 multiple assignment 的右边可以为任何 sequence type。
Dictionary
1 tel = { 'tony': '111234', 988: 'common' }
2 print tel[988], tel['tony']
结果显示 : common 111234
这为 dictionary (assocative array) 的使用范例。可使用任一 immutable type object 为 key, 用以对映(mapping)指定之 object。
1 a = (1, 2)
2 b = (3, 4)
3 c = (1, 2)
4 d = { a: 'aaa', b: 'bbb' }
5 print d[a], d[b], d[c]
结果显示 : aaa bbb aaa
tuple 也为 immutable object,所以也可作为 key。因为 a 和 c 所 bind 的 object 为相同 value 的 immutable type object,因此得到的结果是相同的。tuple 为 key 时, 其内容不可包含任何 mutable type object。
1 a = { 'foo': 'aaa', 'boo', 999, 'coo', 887}
2 print a.keys()
结果显示 : ['boo', 'foo', 'coo']
keys() 为 dictionary 的 method,传回包含所有 key 的 list object。key 的放置不依其次序。
1 a = { 'aaa': 9999, 'bbb', 8888 }
2 for i in 'aaa', 'bbb', 'ccc':
3 if a.has_key(i):
4 print a[i],
结果显示 : 9999 8888
has_key() 为 dictionary 的 method function,用以判断 dictionary 是否包含某 key。
1 a = { 1: 'aaa', 2: 'bbb', 3: 'ccc'}
2 del a[2]
3 b = ['aaa', 'bbb', 'ccc']
4 del b[1]
3 print a, b
结果显示 : { 1:'aaa', 3:'ccc'} ['aaa', 'ccc']
del 指含可以打断 object 和 key 之间的 binding,并将 key 从 dictionary 去除。可以将 list 中的 elemnet 去除。
程式流程、函数与模组
Fllow control
1 if a <= b:
2 if c == d:
3 foo()
4 aoo()
5 else:
6 boo()
上面一个 if 的使用范例,在行 1,如果 a 小於等於 b 行 2~4 会被执行,否则行 6 会被执行。 python 并没有像 Pascal 使用 begin ... end 定义 block,也没有像 C 使用 { ... } 定义 block, python 直接使用缩排决定statement 是否属於同一个 block。如 行1-4 因为缩排而成为一个 block, 而行 2-3 也因为缩排而成为一个 block,每一个 block 则成为一个 compound statement。if statement 的语法规式为 :
if : .....
elif : ......
elif : ....
else: .......
如其它语言,elif 和 else 为选择性功能,elif => else if
1 while a >= b:
2 foo()
3 boo()
4 if c != d: break
5 if c >= d: continue
6 coo()
7 else:
8 doo()
9 eoo()
上面是 while loop 的使用范例,当 a >= b 时,行 2-6会不断的一再执行,直到 a >= b 不成立时(false), 则执行行 8,然後继续往下执行 eoo()。但,如果执行行 4 的 break,则会无条件直接跳离 while loop, 不再执行 while loop 的任何内容(包含 else 的部分),直接执行行 9。若 while loop 中,continue 被执行, 则程式会直接跳过後面的指令回到行 1,进行条件判断。
1 for i in 1, 7, 3, 9:
2 print i,
结果显示 : 1 7 3 9
上面为 for loop 的使用法,for in : ....in 後面可为任何 sequence type object。
1 for i in range(3):
2 print i,
3 print range(3)
结果显示 : 0 1 2 [0, 1, 2]
range(x) 会产生一个包含 0 ~ x-1 的 list。
Function
1 def foo(a, b):
2 return a+b
3 print foo(3, 4)
结果显示 : 7
上面为 function 的定义方式,def (, ....): ....return 可回传 function 的执行结果。 当行 3 执行 foo(3, 4),function foo 会被执行,然後传回 3+4 (a+b) 的结果。
1 def foo(a, b=2):
2 return a+b
3 print foo(3), foo(3,4)
结果显示 : 5 7
function 的参数可以定义预设值,设立预设值的参数如果呼叫时不给予,那麽会使用预设值。
1 def foo(a = []):
2 a.append(7)
3 return a
4 print foo(),
5 print foo()
结果显示 : [7] [7, 7]
预设值只会在 function 定义指令第一次被执行时进行计算,因此上例的 a 参数在第一次执行定义指令时, 就将预设值 bind 到一个 list object,之後使用预设值时就会 bind 到同一个 object,因而产生记忆的现象, 使第二次执行 foo() 所得到的结果受第一次执行的影向。
Module
Python 的 source file 为 *.py 这样的形式,如: foo.py boo.py。Python 定义每一个 source file 为一个 Module。
下面两个 module :
--- a.py ----
def foo():
return action+1
action = 9
--- a.py end ---
--- b.py ---
import a
print a.foo(), a.action
--- b.py ---
执行 'python b.py',结果显示 :
10 9
当需要使用到其它 module 时,可以使用 import 指今,将该 module import 到你的 name space 里。 上例 b modlue 就 import a 这个 modlue,当 b 执行 import 指令时,在 b 的 name space 里, a 这个 name 就会 bind 到一个 module object。module 一但 load 进 memory 时, 就以 module object 代表,以供进一部的使用。所有 module 里定义的 name(function,object 或後面会介绍的 class)都会成为 module object 的 attribute。透过使用 module object attribute, 我们可以 access module 内所定义之 name。module attribute 的使用方式如上例, module 的 name 接着 '.' 接着 attribute 的 name。每个 module 都有自己的 name space, 透过 module attribute,我们可以 access 到其它 module 的 name space。
当 module 头一次被 load 进 memory 时,module 会被从头到尾执行一次。 其执行的结果则定义了 module 的 name space,使 name 和 object bind 在一起。 如上例执行 a.py 中的 def foo(): .... 这个指令时,定义一个 function object, 并使之和 foo 这个 name 进行 binding。
--- a.py ----
def foo():
return action+1
action = 9
--- a.py end ---
--- b.py ---
from a import *
print foo(), action
--- b.py ---
上例和前一个例子是相同的,但使用 from import *,这个指令的作用是, 把 module name space 里所有的 name,import 到目前的 name space 里。'*' 是指所有的 name, 如果只是要 import 特定的 name,那麽你可以指定 name 替代 '*',如 from a import foo。