Python浅议

Python 语言浅议

starstarstarpku@gmail.com

摘要:Python是面向对象的脚本语言,具有很多现代语言的优秀特征;本文简要介绍Python语言的某些特性,应用领域,设计哲学,并与其它语言做简单对比。

注:笔者使用的Python版本是2.4.2

关键字:脚本语言(scripting language) 动态语言(Dynamic Programming Language)、内省(Introspection)、垃圾收集(Garbage Collection)

 

”There is only one way to do it, the right way”

-------Guido van Rossum

Python的历史

      Python的创始人是Guido van Rossum,在发明Python语言之前Guido曾参与过一门称作ABC的语言的设计,ABC是专门为非专业程序员设计的;GuidoPython语言的设计过程中吸收了ABC语言的许多优点,诸如ABC的数据类型(列表、元组、文本等),变量无需声明,内建的功能强大的字符串处理以及简单的控制结构等特性;同时摒弃了ABC语言的一些缺陷,其中最主要的就是使Python更易扩展,这也是Python语言现在如此流行的原因之一。Python的第一个实现是在mac机上,Python语言的设计还受到Modula-3(另一种优美强大的语言)的影响,并结合了Unix ShellC的习惯。现在PythonOpenSource的项目,同时Python社区非常的活跃,极大促进了Python语言的发展。目前Python语言最新的版本是2.4.2

 

Python的特性

      Python是面向对象的,跨平台的,可扩展的解释型通用编程语言,它支持模块和包;Python的代码类型有三种:.py .pyc .pyo,分别是字节代码,二进制代码,优化代码,都可以直接运行,无需编译或者链接的步骤,而且Python还提供交互执行环境;Python是动态类型语言,不需要类型声明;提供自动内存管理;内置高级数据类型和操作支持;Python可扩展,可嵌入;语法简单清晰,强调代码可读性;可动态加载C模块;可动态装载Python模块;Python属动态语言,允许在程序运行期间动态添加删除函数,对类和实例可以在运行时动态添加修改方法;Python是具有内省性的语言;提供标准的GUI框架开发图形界面程序;支持标准Internet协议;支持内建的和第三方提供的库,丰富的库支持;免费使用且完全开放源代码。

 

Python语法

      Python语言中一切事物都是对象,例如如下一个看似普通的字符串:

>>> 'tool.txt'.find('oo')

1

内置在Python中的简单数据类型有:

bool    int      long    float   complex

Python内置容器类包含:

str       unicode          set      frozenset        list       tuple         dict

其中str unicode list tuple都支持访问给定顺序的对象,dict是一个映射

str unicode tuple frozenset这四个容器类一旦创建了,就不能更改它们所存储的数据了;list dict set是可变容器。

除了这些内置高级数据类型,程序员还可以通过扩展模块自定义内置数据类型以支持实际应用;Python属动态类型语言,这是大部分脚本语言的特性:通过赋值决定或改变变量类型;Python使用缩排标识程序块结构,这是Python的一大特色,减少了不必要的块包围符号;strunicodelisttuple等类可以通过乘法实现多个容器的组合,可以通过分片进行分割,还能够负索引表示从后向前查找;可进行连续比较:x<y<8;可同时赋值:x,y,z = 1, 2, 3,甚至x, y = y, x

 

Python内省性

      内省(Introspection)是一个运行时动态发现对象信息的能力:检查某些事物以确定它是什么,它知道什么,它能做什么。Python提供了深入而全面的内省支持,提高了Python语言的灵活性和可控性。另一个相似的概念是Java语言里的反射(Reflection),Java程序可以在运行时加载、查探、使用编译期间未知的classesReflectionIntrospection是经常相提并论的两个术语。下面举几个例子说明Python的内省机制

dir()函数是 Python 内省机制中比较有名的一部分。它返回传递给它的任何对象的属性名称经过排序的列表。举个例子:

>>> dir([])

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

type()函数可以帮助程序员确定对象的类型:

>>> type([])

<type 'list'>

>>>import sys

>>> type(sys)

<type 'module'>

>>> type(dir)

<type 'builtin_function_or_method'>

hasattr()函数和getattr()函数检索一个对象拥有的属性

>>> import os

>>> hasattr(os.dup, '__doc__')

True

>>> print getattr(os.dup, '__doc__')

dup(fd) -> fd2

Return a duplicate of a file descriptor.

callable() 函数测试对象的可调用性:

>>> callable('string')

False

>>> callable(callable)

True

 

Python内存管理

      Python不提供显式的内存分配回收API,完全自动的内存管理;Python memory manager实现了对程序运行时堆的管理,包括内存的分配,垃圾回收机制等;垃圾回收(garbage collection,一下简称GC)在当前的版本中使用的是引用计数垃圾收集和可选的循环结构垃圾空间扫描技术,一旦对象变得‘不可达’的时候就会被回收,但是不保证能够回收包含循环引用计数的内存垃圾。引用计数的算法比较直观:在每个存储片中记录了指向其的指针数目;在对存储片进行某些操作时,对引用计数进行更新,分配一个存储片时引用计数初始化为1,只要存储片的引用被复制,引用计数加1,存储片的引用被删除时,引用计数减1,如果引用计数减为0,则存储片会由于不可达而被回收。很明显引用计数算法不能回收循环的数据结构;设想一个简单的场景:对象a一个成员指向对象b,同时b也有一个成员指向a,而且代码中只有引用a的部分,b对象只是辅助a对象而生成的,如果后来a对象被删除了,那么ab作为一个整体都变成内存垃圾了,理论上应该都被内存管理器删除,但是由于引用计数算法每次只考察一个结点,因此对于循环的数据结构无法回收。所以在编程时应尽量避免循环引用的情况出现。

 

Python的动态性掠影

      Python是动态语言,所谓动态语言(Dynamic Programming Language),现在大致认同的一个定义是:程序运行期间允许改变程序结构或者变量类型。

def change_method(klass, method_name, replacement):

    'change a method using a replacement method'

    setattr(klass, method_name, new.instancemethod(replacement, None, klass))

def changed(self, *args, **kwds):

    print 'args: %s, kwds: %s, nothing' % (args, kwds)

def demo(  ):

    class Test:

        def fun(self, ran):

            print 'This is a method_change test %s' % ran

    d = Test(  )

    d.fun('hehe')

    change_method(Test, 'fun', changed)

    d.fun('haha')

demo(  )

程序输出如下

This is a method_change test hehe

args: ('haha',), kwds: {}, nothing

可以看到Test类的fun方法在程序运行期间发生了改变。

稍稍解释一下程序代码:setattr(object, name, value)函数的功能是用来改变object类的name属性值为value;这里就是改变Test类的fun方法为一个新的方法replacementinstancemethod(function, instance, class)函数返回一个方法对象,注意在python里一切皆对象;可见setattr(…)一个语句就把Test类的fun方法替换成为changed函数了,体现了python的简单强大。

 

Python语言和其它语言的比较

      Python语言的执行效率跟C/C++/Java比起来要稍逊一筹,但是代码长度大大缩短,并且Python跨平台、类库丰富、语法简单、开发速度快,因此常用Python代替C/Java构建大程序,涉及到系统效率的地方可以考虑用C/C++实现。而且Python也可以做glue language(胶水语言),因为PythonCJava的沟通能力非常的好。

三大脚本语言的比较:Perl Python Tcl

      Perl原是专门设计处理文本的,这方面能力最强,但是不适合编写大程序,语法晦涩难懂,与之相比,Python更易阅读,学习,可维护性更强,代码安全性更好(Python的异常处理),并且与Java语言更好的集成能力;Tcl的语法简单,和其它程序的交互能力强,可以和C语言集成,而且有tk辅助GUI开发,但是Tcl更多是作为scripting languageglue language,不适合写大程序,与之相比Python的应用范围要广阔的多。

Ruby:Python的正则表达式没有Ruby的用着方便,RubyPython有更完整的面向对象的语法,Ruby的主要功能都是用类的方法调用来实现的,不是函数;另一方面由于Ruby的强大,语言相对Python复杂,Ruby没有内省性,缺乏国际化支持,缺乏类似Jython的东西。

 

Python的实现

      CPython         通常的Python,完全用C语言实现的最原始的版本

Jython                 Python的纯Java实现;它可以将Python源代码翻译成Java字节码,在Java虚拟机上运行,是与Java的最无缝最平滑的集成;而且用户可以从Python访问所有Java库、构建Applet、与Java Bean集成等

Python for .NET

.NET平台上实现的Python;确切的说Python for .NET是一种编译器和运行时它将 Python 脚本编译成外部虚拟机的格式并使得.NET类库在Python语言中可用

IronPython    .NET平台上的Python相对于传统的PythonIronPython支持可选的静态编译功能静态编译过的IronPython程序就形成了常规的.NET可执行文件.EXE文件。甚至还可以将IronPython程序静态编译为.NET动态链接库(.dll文件)并且供C#VB.NET.NET语言调用

      PyPy              Python写的Python环境,很有趣

 

Python的应用

      Python自身的优秀特性决定了其在实际应用中的广泛性。快速原型开发;网络服务器脚本;科学计算;文档处理;数据库编程;嵌入开发;GUI开发;游戏开发;移动开发......Python拥有强大Python社区的支持,丰富的类库,以及C/C++/Java等语言提供可扩展模块。

      全球已经有很多公司和政府使用Python进行企业级的软件开发和应用,比如Google

"Python has been an important part of Google since the beginning, and remains so as the system grows and evolves. Today dozens of Google engineers use Python, and we're looking for more people with skills in this language."

―――Peter Norvig, director of search quality at Google, Inc.

除了Google,还有NASANYSEYahoo!RealNetworksRedHatLLNLFermilabZope CorporationAlice project at CMUInfoseek等等

Python的哲学(Pythonic

Python交互环境中输入”import this”,可以看到Python语言的设计哲学:

>>>import this

The Zen of Python, by Tim Peters

 

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren't special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one-- and preferably only one --obvious way to do it.

Although that way may not be obvious at first unless you're Dutch.

Now is better than never.

Although never is often better than *right* now.

If the implementation is hard to explain, it's a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea -- let's do more of those!

PerlPythonPerlPython

”The underlying idea that there should preferably be ONE obvious way to express a solution is part of what has kept Python so great as it evolved during the years.”

 

      摩尔定律断言了处理器、内存或者I/O设备等将不再大幅度影响程序的执行效率,对于相当一部分的应用程序而言,实现同样的功能,用系统语言和脚本语言相比,生成代码的运行效率可能都会在可容忍的范围内,但是脚本语言代码量可能会低很多(PythonJava大约是16),开发周期更短,而且现在很多常用的功能都已经用系统语言实现了,可以作为功能模块,配合脚本语言的glue功能,即可完成系统实现。

      一般来说脚本语言的学习相比系统编程语言而言要更容易些,因为系统语言(如C/C++/Java)功能更加强大,语言复杂性高,学习周期长;从某种意义上说,脚本语言一句指令可以做更多事,更加人性化,体现了机器为人服务的宗旨。因为一个程序如果人做的少了,机器就相应做的多了,正好符合自动化的思想,发明机器就是为了要减轻人的劳动。脚本语言从这个角度来说是值得大力推崇的。但是没有什么是完美的,让机器做的太多的代价很有可能就是不如让机器做的少运行效率高。比如Python运行时要做动态的类型检查,要耗费机器运行时间,在C等静态编译的语言中这个工作是留给人做了,还有一些类似的因素,因此C的效率比Python高很多。

       PerlAwkZopePythonPrologCJavaPython

 

总结

Python最大特点:简单易用优美强大。简单性是Python语言最核心的设计哲学,例如Python的很多功能都是以扩展模块的形式提供的,Python的内核很小巧,语法简单,很容易学习;Python强调代码的可读性,以缩排的方式省去冗余,代码给人的感觉很清爽、美观;程序以模块和包的形式分发,版本可控性强;Python编译成的字节码具有平台无关性;代码长度相比C/C++/Java短很多;这些特性导致Python的开发周期短,而且可以作为快速原型开发的语言使用,即先用Python实现程序的主要模块,并测试发现bug,等模块稳定了之后再用C/C++等语言来实现替换Python模块;Python受到开源社区的广泛欢迎,大批的志愿者为Python语言贡献了源代码,使得Python的功能日趋完善。

Python还有很多不完善的地方,Python社区非常活跃,程序员可以通过提交PEP(Python增强提议)提出对Python语言改进的方案,促使Python语言不断发展;Python已经有15年的历史了,这期间不断的有新的语言特征被加进来,2.2版本之后的Python更倾向对大型软件的支持,比如静态方法,generatorpropertymethod decorator等特征,对其它语言的优点Python也很注意学习。

 

参考资料

[1] Python Documentation (Release 2.4.2) Python文档

[2] Alex Martelli, David Ascher Python Cookbook    O’Reilly

[3] Mark Lutz, David Ascher     Leaning Python       O’Reilly

[4] http://www.python.org            Python主页

[5] http://www.pythonology.com    Python成功案例

[6] John K. OusterhoutScripting: Higher Level Programming for the 21st Century”     IEEE Computer magazine  March, 1998

一篇比较老的论文,讲脚本语言跟系统编程语言的对比并预测前者的未来

 

 

声明:由于本人接触Python时间不长,所以文中难免出现错误,某些观点可能偏激,欢迎发信和我交流探讨  starstarstarpku@gmail.com     12/12/2005

阅读更多
换一批

没有更多推荐了,返回首页