`

Python 语言浅议

阅读更多

转载于http://blog.csdn.net/unicode1985/archive/2005/12/22/559694.aspx

 

摘要: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是专门为非专业程序员设计的;Guido在Python语言的设计过程中吸收了ABC语言的许多优点,诸如ABC的数据类型(列表、元组、文本等),变量无需声明,内建的功能强大的字符串处理以及简单的控制结构等特性;同时摒弃了ABC语言的一些缺陷,其中最主要的就是使Python更易扩展,这也是Python语言现在如此流行的原因之一。Python的第一个实现是在mac机上,Python语言的设计还受到Modula-3(另一种优美强大的语言)的影响,并结合了Unix Shell和C的习惯。现在Python是OpenSource的项目,同时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的一大特色,减少了不必要的块包围符号;str、unicode、list、tuple等类可以通过乘法实现多个容器的组合,可以通过分片进行分割,还能够负索引表示从后向前查找;可进行连续比较:x<y<8;可同时赋值:x,y,z = 1, 2, 3,甚至x, y = y, x。

 

 


Python内省性


      内省(Introspection)是一个运行时动态发现对象信息的能力:检查某些事物以确定它是什么,它知道什么,它能做什么。Python提供了深入而全面的内省支持,提高了Python语言的灵活性和可控性。另一个相似的概念是Java语言里的反射(Reflection),Java程序可以在运行时加载、查探、使用编译期间未知的classes。Reflection和Introspection是经常相提并论的两个术语。下面举几个例子说明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对象被删除了,那么a和b作为一个整体都变成内存垃圾了,理论上应该都被内存管理器删除,但是由于引用计数算法每次只考察一个结点,因此对于循环的数据结构无法回收。所以在编程时应尽量避免循环引用的情况出现。

 

 


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方法为一个新的方法replacement,instancemethod(function, instance, class)函数返回一个方法对象,注意在python里一切皆对象;可见setattr(…)一个语句就把Test类的fun方法替换成为changed函数了,体现了python的简单强大。

 

 


Python语言和其它语言的比较


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


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


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


Ruby:Python的正则表达式没有Ruby的用着方便,Ruby比Python有更完整的面向对象的语法,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;相对于传统的Python,IronPython支持可选的静态编译功能,静态编译过的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,还有NASA,NYSE,Yahoo!,RealNetworks,RedHat,LLNL,Fermilab,Zope Corporation,Alice project at CMU,Infoseek等等


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!

 

与Perl语言不同,Python力求精简,Perl会提供给程序员很多种解决问题的方式,语言的泛化更强,但是Python则会在泛化、简单性和性能等方面作出权衡,力求给出一个最佳方案。”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设备等将不再大幅度影响程序的执行效率,对于相当一部分的应用程序而言,实现同样的功能,用系统语言和脚本语言相比,生成代码的运行效率可能都会在可容忍的范围内,但是脚本语言代码量可能会低很多(Python和Java大约是1:6),开发周期更短,而且现在很多常用的功能都已经用系统语言实现了,可以作为功能模块,配合脚本语言的glue功能,即可完成系统实现。


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


       脚本语言有其与生俱来的优点,但是优点也决定了缺点。类似的,各种语言之间都互有差异,语言只是工具,要根据任务的不同选择不同的工具。比如要文本处理就使用Perl或Awk,使用Zope就用Python,做专家系统就用Prolog,要跟操作系统底层交互就用C,跨平台就用Java或Python。总结


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更倾向对大型软件的支持,比如静态方法,generator,property,method 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. Ousterhout “Scripting: Higher Level Programming for the 21st Century”     IEEE Computer magazine  March, 1998


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

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/unicode1985/archive/2005/12/22/559694.aspx

分享到:
评论

相关推荐

    python语言程序设计实践教程上海交通大学-Python语言程序设计.pdf

    Python语言程序设计实践教程是上海交通大学推出的一门课程,旨在教授Python编程基础知识和实践技能。随着Python在教育领域的普及,越来越多的学校和专业选择开设这门课程,原因在于Python的简洁语法和强大的第三方库...

    基于Python语言的树叶识别系统源码+演示视频.zip

    基于Python语言的树叶识别系统源码+演示视频.zip基于Python语言的树叶识别系统源码+演示视频.zip基于Python语言的树叶识别系统源码+演示视频.zip基于Python语言的树叶识别系统源码+演示视频.zip基于Python语言的树叶...

    《Python语言基础》期末测试试题.docx

    Python语言基础期末测试试题知识点总结 本资源摘要信息涵盖了Python语言基础期末测试试题的知识点,涵盖了Python语言的基础概念、语法、数据类型、函数、模块、异常处理、文件输入/输出、数据结构等方面。 Python...

    Python语言程序设计习题答案.zip

    组合数据类型是Python语言区别于其他高级编程语言的一大特色,通过组合数据类型,省去了其他语言各种复杂数据结构的设计,给编程人员带来了极大的方便,这也是Python流行于数据分析领域的原因之一。学习本章,要熟练...

    《Python语言程序设计》[刘卫国][习题解答]

    Python语言不仅语法优雅、清晰、简洁,而且具有大量的第三方函数模块,因此很适合初学者作为程序设计入门语言进行学习,对学科交叉应用也很有帮助。本书介绍Python语言程序设计的基础知识。全书以Python作为实现工具...

    Python语言程序设计(微课版)配套PPT

    Python是一种高级编程语言,以其简洁明了的语法和强大的功能深受程序员喜爱。"Python语言程序设计(微课版)"是一门旨在教授Python编程基础知识及其在不同领域应用的课程,由专家宁爱军主讲。这门课程通过一系列PPT...

    Python语言程序设计基础第2版嵩天课后习题答案.pdf

    《Python语言程序设计基础》第二版是一本针对初学者深入浅出的Python教程,由嵩天、礼欣、黄天翮三位作者共同编写。书中强调了以理解和应用计算生态为目标的Python教学理念,旨在帮助读者不仅仅是掌握Python语法,更...

    Python语言数据结构.pdf

    Python语言数据结构.pdf

    Python语言程序设计教程.pptx

    "Python语言程序设计教程" 本资源是关于Python语言程序设计的教程,总共分为10章,涵盖了Python编程语言的基础知识、数据类型、控制结构、函数、模块、文件处理、异常处理、面向对象编程、多线程编程等方面的内容。...

    python语言简介资料学习

    网页制作 课题研究 python语言学习

    Python语言程序设计(T0-T9)课件打包.zip

    Python语言程序设计课件 T0-说明.ppt Python语言程序设计课件 T1-程序设计基本方法.ppt Python语言程序设计课件 T2-Python程序实例解析.ppt Python语言程序设计课件 T3-基本数据类型.ppt Python语言程序设计课件 T4-...

    Python语言程序设计实践教程-参考答案.rar

    Python是一种高级编程语言,以其简洁明了的语法和强大的功能深受程序员喜爱,广泛应用于Web开发、数据分析、人工智能等领域。本教程“Python语言程序设计实践教程”旨在帮助学习者通过实践来掌握Python编程基础,而...

    Python语言程序设计基础教程(持续更新).pdf

    Python语言是一种高级编程语言,以其简洁明了的语法和强大的功能深受程序员喜爱,尤其适合初学者入门。本教程旨在提供Python编程的基础知识,帮助学习者快速掌握Python编程的基本概念和技巧。 第一章概述部分通常会...

    Python语言程序设计教程_例题源码

    Python语言程序设计教程_例题源码

    文卷调查python语言脚本

    文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文卷调查python语言脚本文...

    赵璐python教程答案-《Python语言程序设计教程》赵璐著【摘要书评在线阅读】-苏宁 .pdf

    《Python语言程序设计教程》由赵璐编著,是一本针对初学者的Python编程教材,旨在教授Python的基础知识和实际应用。本教程分为多个章节,涵盖了计算机基础、Python语法、数据结构、流程控制、函数、文件操作、文本...

    Selenium2自动化测试实战 基于Python语言

    《Selenium2自动化测试实战——基于Python语言》是一本针对软件测试工程师,尤其是对Web应用程序自动化测试感兴趣的读者的专业书籍。作者虫师在2016年10月编写了这本书,尽管时间已过去数年,但Selenium作为自动化...

    Python语言在Abaqus中的应用.pdf

    曹金凤的《Python语言在Abaqus中的应用》,随书资源Pythonreader

    OpenCV 3计算机视觉:Python语言实现

    OpenCV 3计算机视觉:Python语言实现,代码+pdf文档,适合于计算机视觉研究者

    教孩子学编程 PYTHON语言版

    教孩子学编程 PYTHON语言版 教孩子学编程 PYTHON语言版

Global site tag (gtag.js) - Google Analytics