580 likes | 915 Views
2.1 Python 概要 Python 是一门解释性的、面向对象的、动态语义特征的高层语言。高层次的数据结构,动态类型和动态绑定,使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的软件部件; Python 简单的语法强调可读性,降低了程序维护的费用; Python 支持模块和包,易于实现程序模块化和代码重用; Python 的解释器和标准扩展库的源码和二进制格式在各个主要平台上都可以免费得到,而且可以免费分发; Python 没有编译过程,编辑 - 测试 - 调试周期相当快;
E N D
2.1 Python概要 • Python是一门解释性的、面向对象的、动态语义特征的高层语言。高层次的数据结构,动态类型和动态绑定,使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的软件部件; • Python简单的语法强调可读性,降低了程序维护的费用; • Python支持模块和包,易于实现程序模块化和代码重用; • Python的解释器和标准扩展库的源码和二进制格式在各个主要平台上都可以免费得到,而且可以免费分发; • Python没有编译过程,编辑-测试-调试周期相当快; • 解释器和很多库都是OpenSource,但是License都比较宽松,可适用于各种情况,解释器非常稳定。
Python是什么? Python是一种开放源代码的脚本编程语言,这种脚本语言特别强调开发速度和代码的清晰程度。它可以用来开发各种程序,从简单的脚本任务到复杂的、面向对象的应用程序都有大显身手的地方。Python还被当作一种入门程序员最适合掌握的优秀语言,因为它免费、面向对象、扩展性强同时执行严格的编码标准。 Python 对程序语句的处理首先通过一个解释和编译系统转换成为一系列的字节代码,然后再由 Python 的虚拟机进行处理。Python 设计得非常有效,主要归功于它庞大的功能库,因此用户不用进入系统环境或是操作系统,也不用引用模块。用 Python 编程,小程序还是小程序,不必劳费太多的成本和时间。
Python是什么? * 面向对象 * 解释语言 * 交互式 * 模块化 * 动态性 * 高级语言 * 可移植 * 可用C和C++扩展
Python的历史Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC语言的一种继承。之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个Monty 大蟒蛇飞行马戏团的爱好者。 ABC是由Guido参加设计的一种教学语言(没听说过)。就Guido本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido认为是非开放造成的。Guido决心在Python中避免这一错误(的确如此,Python与其它的语言如C,C++和Java结合的非常好)。同时,他还想实现在ABC中闪现过但未曾实现的东西。 就这样,Python在Guido手中诞生了(真要感谢他)。实际上,第一个实现是在Mac机上。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix Shell和C的习惯。
运行方式Python可以以命令行方式运行,也可以交互式方式运行,还具有图形集成环境,这样开发Python就相当方便。现在已经出现了许多用Python编写的可视化编程软件,用于实现象Delphi一样的功能。 面向对象Python是一个真正的面向对象语言。它甚至支持异常的处理。如果学过Java,应该对这个不陌生。但其它的脚本语言,如PHP,好象就没有。这使得程序的编写更加清晰,而不需要许多的错误检查了。 模块和包这一点更象是Java。对于Java的支持,大家可以了解JPython。JPython是用Java写的Python,它完全支持Java,在这个环境下使用Python可以随意地使用Java的类库。
有趣的语法Guido认为Python的语法是非常优美的。其中一点就是,块语句的表示不是C语言常用的{}对,或其它符号对,而是采用缩近表示法!有趣吧。就这一点来说,Guido的解释是:首先,使用缩近表示法减少了视觉上的混乱,并且使程序变短,这样就减少了需要对基本代码单元注意的范围;其次,它减少了程序员的自由度,更有利于统一风格,使得阅读别人的程序更容易。感觉还是不错的,就C语言来说,在if语句后面大括号的写法就好几种,不同的人喜欢不同的样子,还不如统一起来,都不会看得别扭。 在每个类或函数的定义后面,第一行可以是说明语句,根本不需要注释符标记。对于后面跟块语句的语句,后面应跟上一个冒号(:)。一行语句不能太长,因为没有行结束符,如果超长则要使用续行符(\)。
Python品质超群 虽然Python常用来创建简单的脚本,但它采用的编程技术可不简单,比如面向对象编码、套接字、线程和GUI等等。假如你是一位刚入流的程序员,这些特性显然对你太有帮助了,因为你可以很快熟悉有益的编程语法和编码实践,之后再学习其他语言,比如Java或者C++等引入的技术概念就容易多了。脚本可以单独执行,不过,你还可以通过类文件和各类对象类型以充分利用这种语言的强大功能。Python区别于其他面向对象语言的关键有两点。首先,Python强调空格和编码结构,从而令开发者的代码具有良好的重用性。其次,执行脚本之前无须编译Python代码,这就是它为什么被当作脚本语言的原因。
Python易于扩展 Python语言有一个引人注目的优势,它可以针对语言无法完成功能的函数调用函数库。Python还具有有些相当有用的工具帮助开发出复杂的应用程序。其中最常用的就是Tkinker,这种工具可以实现跨平台的GUI开发。另一种wxPython工具则是对wxWidgets跨平台C++框架的扩展。WxPython目前已经支持Windows和Linux平台。Python Imaging Library可以让Python创建、打开、编辑和修改图象,包括.gif、.jpeg和.png等。为了了解常用的Python扩展和应用,你不妨访问下The Vaults of Parnassus。Python自身还可以嵌入到其他编程语言中。最常见的就是Jython,这是一种用Java编写的Python解释器。这样你就可以同时利用两种语言的优点。你还可以在强大的Java应用程序框架中结合Python清晰的语法来创建出依赖于两种语言库的应用程序。
语言扩展可以用C、C++或Java为Python编写新的新言模块,如函数。或者与Python直接编译在一起,或者采用动态库装入方式实现。也专门有人编写了一个工具,可以实现为Python自动实现函数接口封装,这就是SWIG(Simplified Wrapper and Interface Generator),或称做简单封装和接口生成器(可以在 http://www.cs.utah.edu/~beazley/SWIG自由获得)。
互联网程序设计Python 带有的标准模块可以对网络插槽进行初级和协议级别的通讯,比如,如果要从 POP 服务器上读取电子邮件,Python 随带的库模块可以做到。另外, Python 还支持 XML、HTML和 CGI 库文件,所以利用它可以解析用户输入的需求,并通过网络服务器产生最佳质量的成果。 程序员还可为拥有 Python 内置解释器的 Apache、Unix 和 Windows 网络服务器编译模块。基于 CGI 程序的功效,可以很方便地执行 Python 语句而不用单独装载。
数据库编程Python 中有无数的扩充模块可以连接如 Orcle、Informix 、mySOL和PostgreSql等通用的数据库系统;还有称作 Gadfly 的工具可以独立Python 提供完全的SQL环境。Python 有强大的文本和数据处理能力,可以用它作为不同数据库间的连接,比起那些数据库附带的总结和汇报工具显得更有优势。同时,由于它支持不同系统,用同样的接口也可以连接任何数据库。可以用 Tk 在支持平台上建立前端,马上就可获得高速跨平台、独立数据库的查询工具。
跨平台开发Python 以中立方式支持不同的一系列平台,如果用户使用的系统包含不同的平台,使用 Python 开发应用程序则再好不过;它这种适应性也可以为系统预留使用其它工具的可能。对于频繁更换平台用户,Python 是个理想的选择。 为最终用户提供软件服务时,Python 也是个备选方案,可以避免同时用不同应用软件编程的时间和费用。
编码标准 严格的Python语法是初级程序员忽略这一强大编程语言的最主要原因。和大多数的其他面向Web脚本语言不同的是,Python的空白排版不依赖于括号或者分号来表示语句结束,换行和占位符用来描述代码的可视结果。这种编程方式乍看之下令人感到厌烦,但却对你另有莫大的好处,这就是代码的可靠性。Python这种结构化是建立在下面的理论之上:开发者的工作时间机构财产中最有价值的财富。一旦你习惯了编写Python代码的规则。实际上你就习惯了一种内建的编码标准。这也正是大多数Python开发者所依赖的标准。 获取Python 你可以从http://www.python.org或者各类平台上的Python版本。ActiveState网站也发布用于 Windows、Linux和Solaris等平台的Python库。
最简单的Python代码 下面我们举例说明Python。假设你目前使用的是Windows系统,而且已经安装了Python,请首先启动IDLE,也就是Python的GUI。现在处于Python Shell中(如果你在UNIX类型的系统上就需要键入 python类型指示你的Python可执行文件)。接着在“>>>”提示符下键入:>>>print “Hello World”这个大家耳熟能详的程序就在屏幕上显示出结果,你还可以如下所示给变量赋值:>>>myvar = 42>>>print myvar在上例中会显示结果42。
Python 相关连接 中文 http://www.sunistudio.com/lythm/docs/boost/Python/index.html http://dohao.org/python/ http://python123.yeah.net http://diveintopython.org/cn/ http://www.cngnu.org/technology/05974786f6e6.html http://www.csdn.net/expert/Forum.asp?roomid=92&typenum=2 http://www.math.pku.edu.cn/teachers/lidf/docs/Python/python-tutorial.html http://youwu.51.net/minimal.html http://python.3322.net/ 英文 http://www.python.org/ http://www.pythonware.com http://www.onlamp.com/python/ http://diveintopython.org/ http://www.stackless.com/ http://www.ddj.com/topics/pythonurl/ http://www.devshed.com/Server_Side/Python http://www.jython.org/ http://www.vex.net/parnassus/ http://py-howto.sourceforge.net/ http://www.uselesspython.com/ http://www.boost.org/libs/python/doc/ http://pygame.org/
Python 相关书藉 • Python语言入门(Learnig Python ) • Python核心编程(Core Python Programming ) • 深入学习:Python程序开发(Python Developer’s Handbook ) • Python程序员指南 • Python 编程指南 • Python 2.1宝典 • Python技术参考大全 • XML与Perl、Python和PHP编程指南 • Zope指南
Python 相关程序 • Zope对象发布环境: • 对象发布允许你生成动态内容。不象HTML页面或CGI程序,Zope是以对象的方式来看待一个web应用的。对象是小的内容与行为的混合体。Zope允许你将对象编写在一起来生成强大而又灵活的对象集。这些对象集可以对web请求进行应答。结果就是动态内容。每个Zope对象感觉上是“聪明的”,它们是自适应的并且可以同其它对象进行通信。Zope对象是协同工作的。对象可以从其它的对象获得信息和行为。将对象联系在一起的方式决定了对于它们哪些服务和内容是有效的。对象适当地根据给定的上下文对象和内容表现自已。这就是发布(publishing)处理。 • 每一个Zope对象都是动态的,并且可以使用不同的方式来发布,从而展现不同的行为。
2.2 Python 快速入门 2.2.0 安装与运行python-2.4.2.exe
1a = 0 2b = 7 3a = a + 1 4a = b * a 5print a 结果显示: 7 2.2.1基本的运算式 下面是 python 的简单例子,如果你学过其它的语言 (如 C/C++, Java),就能很容易的了解。 PYTHON提供了基本的数字类型, 包括integers , long integers , reals , 和 complex numbers
2.2.2基本数据类型与操作 (1)String string 可以使用 ' 或 " 符号括起来表示。 例3是合并四个 string对象的例子, 将四个 string 依顺连接成单一的 string。
在例1,类似於 C/C++ 的 printf 或 sprintf,python 提供 string format 的功能。 字串 '%s=%d' 指定 string 的 format,而後在字串後接着 % 然後是 format 的参数, 这些参数会依序取代 format 里的 %s 和 %d。%s 代表要取代字串,%d 则是取代成整数。
string 可以延伸到数行,但在每一行的最後必需要有escape \ 以忽略掉 newline。 另外也可以使用 """ 或 ''' 使用 ''' 或 """ 就不需要在每一行结数时附加escape,但 在string 内容中包含了newline。
(2)List 上 上面是 list 的使用范例。list 是一个 sequence data type, 类於 C/C++ 的 array, 但 array 是 fixed length 而 list 不是, 其长度是可以随时改变的。 l例 1 把变量a 初始化为一个list。 l例2 则指定 index 0 为 'aoo'的 string object。 l例3 为 list 的 slice 的使用范例。 将 index 1 和 index 3 之间的 item(index 1 和 2) 代换成 10 和 11。 l例5 的 b[:3] 则相当於 b[0:3], 而 b[1:] 相当於 b[1:4]。 list 内的 item 不需是相同的 type, 如上例在一个 list object 里可以同时包含整数和 string 不同 type 的 item。
和 string 一样,list 也可以进行合并操作(concatenate)。
Slice index 可为负数,负数则从 list 的结束位置往回数。 list 的 index 可以比作下图,每一个 item 指 list 里的一个 object。而 | 则为 item 之间的分界, 其下方则为其 index。 当指定 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 上面是 list 的 append() 和 insert() 两个 method 的使用范例。 append 用以新增一个 item 到 list 的最後面。 insert 用以在指定的位置插入一个新的 item。行 4即在 list 的 index 1 的位置(即 item 0 和 item 1 之间)插入一个新 item。
sort() method 能将 list 进行从小到大的排序,reverse() method 则进行从大至小的反向排序。
String vs liststring 也和 list 同为 sequence data type,也可作 slice operator,但 string 为 immutable object,不可修改其内容。
string 也和 list 一样,可以 subscript (index) 其中的 item。python 并不像 C/C++ 般, python没有独立的 character type,string 的 subscripted item 为一长度为 1 的 string。
Nested listlist 里的 item 可以为另一个 list object,成一个巢状的结构。
(3)Tuple & multiple assignment 行 2 称为 multiple assignment,可以同时指定多个变量的内容。
行 1 将变量a赋值为 (1, 2, 3, 4, 5)。python 定义(1, 2, 3, 4, 5)为 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。 上面的操作称之为 tuple unpacking,将等号右边的 sequence type object 解开成数个 object,赋值给等号左边的变量。左边变量的个数必需和右边的 item 数目相同。
(4)Dictionary 这是dictionary (assocative array) 的使用范例。可使用任一 immutable type object 为 key, 用以映射(mapping)与之相关的object。
tuple 也为 immutable object,所以也可作为 key。因为 a 和 c 所 bind 的 object 为相同 value 的 immutable type object,因此得到的结果是相同的。tuple 为 key 时, 其内容不可包含任何 mutable type object。
keys() 为 dictionary 的 method,传回包含所有 key 的 list object。key 的放置不依其次序。
has_key() 为 dictionary 的 method function,用以判断 dictionary 是否包含某 key。
del 指含可以打断 object 和 key 之间的 binding,并将 key 从 dictionary 去除。可以将 list 中的 elemnet 去除。
2.2.3控制流程、函数与模块 (1)控制流程 IF语句 上面一个 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 的语法规式为 : 如其它语言,elif 和 else 为选择性功能, elif => else if。
WHILE语句 上面是 while loop 的使用范例,当 a >= b 时,行 2-6会不断的一再执行,直到 a >= b 不成立时(false), 则执行行 8,然後继续往下执行 eoo()。但,如果执行行 4 的 break,则会无条件直接跳离 while loop, 不再执行 while loop 的任何内容(包含 else 的部分),直接执行行 9。若 while loop 中,continue 被执行, 则程式会直接跳过後面的指令回到行 1,进行条件判断。
FOR语句 上面为 for loop 的使用法,for <name> in <sequence type object>: ....in 後面可为任何 sequence type object。
(2) 函数 上面为 function 的定义方式, return 可返回function 的执行结果。 当行 3 执行 foo(3, 4),function foo 会被执行,然後返回 3+4 (a+b) 的结果。
function 的参数可以定义预设值,设立预设值的参数如果调用时不给予,那麽会使用预设值。
预设值只会在 function 定义指令第一次被执行时进行计算,因此上例的 a 参数在第一次执行定义指令时, 就将预设值 bind 到一个 list object,之後使用预设值时就会 bind 到同一个 object,因而产生记忆的现象, 使第二次执行 foo() 所得到的结果受第一次执行的影向。
(3) 模块 Python 的 source file 为 *.py 这样的形式,如: foo.py, boo.py。Python 定义每一个 source file 为一个 Module。 下面两个 module : 执行 'python b.py',结果显示 :
当需要使用到其它 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。