python起航

我的Python之路

  • 在开始写这个系列文章之前,首先申明,此系列文章主要记录了我自己学习Python的过程,以下文章只是我的个人见解,如有错误欢迎大家指出,当然写的过程不免会和网上的一些文章相似或者冲突,我写此文章的目的只是在为了巩固自己的知识,也是对技术的一种沉淀!

 

Python起源

  • 了解一门技术,首先先看看它的历史与起源,这一点我认为是至关重要的,一种技术的诞生它终究是解决了一些别的技术解决不了的问题,当然也会有其存在的价值.

那么Python究竟是怎么产生的呢?

  • Python,是荷兰科学家吉多·范罗苏姆(Guido van Rossum),在1989年,为了打发圣节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中Python作为该编程语言的名字,是因为他是一个叫MontyPython喜剧团体的爱好者。ABC是由Gudo参加设计的一种教学语言。就Gudo本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Gudo认为是其非开放造成的。Guido决心在Python中避免这一错误,同时,他还想实现在ABC中闪现过但未曾实现的东西,就这样,Python在Gudo手中诞生了。可以说,Python是从ABC发展起来的,主要是受到了Modula-3的影响,并且结合了Unix shell和C的习惯。

  • 1991年, Python第一个公开发行版本发行,它是一种面向对象的解释型计算机程序设计语言,它是使用C语言实现的,并且能够调用C语言的库文件。从一出生, Python已经具有了类、函数、异常处理,包含列表和字典在内的核心数据类型,以及模块为基础的拓展系统。这些在后面都会一一讲解.

  • 最初的Python完全由Gudo本人开发。Python得到Gudo同事的欢迎,他们迅速地反馈使用意见,并参与到Python的改进中。Gudo和一些同事构成Python的核心团队,他们将自己大部分的业余时间用于发掘Python。随后,Python拓展到研究所之外。Python将许多机器层面上的细节隐藏,交给编译器处理,并凸显出逻辑层面的编程思考。Python程序员可以花更多的时间用于思考程序的逻辑,而不是具体的实现细节,这一特征吸引了广大的程序员,Python开始流行。2011年1月,Python赢得TOBE编程语言排行榜的年度语言。时至今日,Python依然是一种很火的存在.

那么Python究竟是一种怎样的语言呢?

  • 在Python语言中,一切皆为对象,即使函数也是对象,有自身的属性。Python是解释型编程语言,运行Python程序时,需要将解释器翻译Python代码。

  • Python是一种不受局限、跨平台的开源编程语言,其数据处理速度快、功能强大且简单易学,在数据分析与处理中被广泛应用。而且,Python采用解释运行的方式,编写后无需进行编译即可直接通过解释器执行,具有典型的动态语言特点,编程效率极高。Python是完全面向对象的语言,数字、模块、字符串、数据结构都是对象,并且支持常见的类概念,如继承,重载,派生,多重继承。

  • 总结成一句话就是:Python是一种面向对象的解释型高级程序语言.

    • 解释型语言和编译型语言的区别

      • 编译型语言有专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性翻译成可被该平台执行的机器码,并包装成该平台所能识别的可执行程序的格式,这个过程称为编译。编译生成的可执行程序可以脱离开发环境,在特定的平台上独立运行。如:C C++ Objective等

      • 解释型语言是指使用专门的解释器对程序逐行解释成特定平台的机器码并执行的语言。解释型语言通常不会进行整体性的编译和连接处理,解释型语言相当于把编译性语言中的编译与解释过程混合到一起同时完成。如: Python Java Perl basic等(有人说Java是编译型的。因为所有的Java代码都是要编译的,.java不经过编译就无法执行。 也有人说Java是解释型的。因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释型的。对于C和C++,它们经过一次编译之后,可以由操作系统直接执行,所以它们是编译型语言。而Java不一样,它首先由编译器编译成.class(字节码)文件,然后在通过JVM从.class文件中读一行解释执行一行,所以它是解释型的语言。也正是由于java对于多种不同的操作系统有不同的JVM,所以实现了真正意义上的跨平台。)

      • 补充一点:任何一种语言都可以解释执行和编译执行。解释和编译是程序运行的两种方式。 不能用来区分语言.

Python语言特点

  • (1)简单清晰

    Python是一种代表简单主义思想的语言,之所以这么说,是因为Python是一门清晰的语言,它的作者在设计它的时候,总的指导思想是,对于一个特定的问题,只要一种最好的方法来解决就好了。Python和其他大多数语言的一个主要区别就是完全由每行的首字符缩进来界定一个模块的界限,不可否认,通过使用缩进使得Python程序显得清晰和美观。阅读一个优秀的Python程序就感觉像是在读英语一样,Python的这种伪代码特性使开发者能够专注于解决问题而不是去搞明白语言本身。

  • (2)纯面向对象

    与传统的面向对象语言(C++,Java)不同的是,在Python的世界里,万物皆为对象。模块,类,函数,变量,类的实例都属于Python中的对象,例如函数是一个对象,它有自己的代码块,注释文档以及变量字典。

  • (3)支持面向过程和面向对象编程

    Python不强制你使用类的概念组织软件,你可以以面向过程的思想编写你的软件。这个类似于“+,完全可以不用c++面向对象的特性编写软件,退化为c语言了。

  • (4)非常丰富的标准库支持

    Python提供了一套功能完善的内置库支持,除了基本的数据结构,如链表,字典,字符串操作等,还提供了很多在程序中会经常使用的操作,比如正则表达式,配置文件,tar文件格式的创建和读取。

  • (5)具有良好的可扩展性

    Python与c/c++语言有良好的交互性,你既可以在Python中调用用C实现的模块,也可以在C中调用Python解析器。这个类似于Java的JNI了。对于一些性能要求高的模块,用C语言编写Python模块是一种不错的选择。

Python代码执行过程

  • Python的代码文件.py文件中的语句并没有被转换成一系列的机器指令,Python代码的执行原理和Java代码、C#代码的执行原理类似,都是通过解释器生成字节码文件,然后在虚拟机中执行。

  • Python解释器(interpreter),当在命令行下敲入Python时,目的就是为了激活这个解释器。当通过“python test.py”执行Python程序时,Python解释器立即被激活,然后执行Python程序,然而在真正开始执行之前,实际上,Python的解释器还要对.py文件进行编译。编译的结果是产生一组Python的字节码序列,以.pyc文件保存。然后将编译的结果交给Python的虚拟机,由虚拟机按照顺序一条一条地执行字节码,从而完成对Python代码的执行,如图2.1所示。

                          

解释器编译过程

  • (1)将程序源代码解析为语法分析树,实现的源文件为parser/pgen.c。

  • (2)将语法分析树转换为抽象语法树,实现的源文件为python/ast.c。

  • (3)将抽象语法树转换为字节码,实现的源文件为python/compile.C。

  • 如图2.2所示,展示了Python的编译流程。不论是交互模式,还是以文件的形式运行Python,解释器都会根据源代码生成一颗语法分析树,随后再根据这个语法分析树建立抽象语法树,然后从抽象语法树中可以生成字节码。

Python虚拟机

  • Python的虚拟机和Java的JVM虚拟机一样,是Python的核心,在源代码被编译器编译为字节码指令序列之后,就将由Python的虚拟机处理后续的工作。虚拟机会从编译得到PyCodeObject对象中依次读入每一条字节码指令,并在当前的上下文环境中执行这条字节码指令。

  • Python的虚拟机实际上是在模拟操作系统运行可执行文件的过程,下面简单分析可执行文件在操作系统中是如何运行的。如图3.1所示,表示了可执行文件运行的栈的具体结构。

 

  • 在图3.2所示的C语言代码中,当程序进入foo函数时,对应图3.1中调用者的帧是函数bar的栈帧,而当前帧则是函数foo的栈帧。函数的所有局部变量的操作都是在它自己的栈帧中完成的,而函数之间的调用需要创建新的栈帧。当函数bar中调用foo函数时,操作系统会在函数bar的栈帧之后创建foo的栈帧。在函数调用的同时,操作系统会保存上一个栈帧的栈指针esp和帧指针ebp,函数调用完成后,操作系统会把esp和ebp恢复。这样程序又回到了bar函数的流程。

  • Python在虚拟机中是通过模拟图3.1中操作系统对可执行文件的运行来执行字节码指令序列的。下面通过分析一段Python代码来说明这个问题,如图3.3所示。

  • 在图3.3中所示的代码片段中,有两处“print text”,与之相对应的字节码指令是相同的,但是在执行环境的影响下,两条语句的执行效果不同。结合可执行文件的运行原理,我们可以解释test.PY文件的执行过程。当Python开始执行test.PY的第一行代码时,Python建立了一个执行环境,设为E1,所有的字节码指令在这个执行环境中执行。当函数被调用时,比如图3.3中的“fooO”,Python虚拟机会在当前的执行环境El之外新建一个执行环境E2。在E2中,有一个新的名字为“text”的对象。Python在真正执行的时候,它的虚拟机实际上面对的并不是一个PyCodeObject对象,而是PyFrameObject。PyFrameObject就是Python虚拟机的执行环境。

Python正则表达式语法

  • 在对特定的字符串进行查找时,需要特定的规则对这类字符串进行描述。正则表达式可以理解为描述这些特定规则的工具,也可以理解为记录这些特定规则的代码。当然,在编写正则表达式时,需要遵循特定的语法规则,语法规则会因编写语言的不同而存在诸多差异。本文中用到的Python正则表达式中的部分语法规则如表3一1所示。

Python语言与模块

  • Python程序语言中对正则表达式的操作通过re模块实现,re模块中内置了对正则表达式处理的函数,在系统设计过程中调用这些函数就可以实现正则表达式的操作。本文中用到的处理函数如表3.2所示:

 

Python抽象语法树处理技术

  • 抽象语法树是程序在编译过程中形成的一种中间形式,抽象语法树中含有程序中所有的静态信息。通过抽象语法树可以非常直观的观察到整个程序的语法结构,可以对程序作更为细致的处理。

  • Python程序语言中内置了抽象语法树(AST)模块,该模块提供了一些抽象语法树处理接口,调用这些接口可以对python程序代码进行编译分析,生成对应的抽象语法树,抽象语法树中的每一个树节点都代表着python程序代码中的语法信息或结构信息。所以,系统可以通过这个模块精确地提取python程序代码中的语法结构和程序结构。在python模块中定义了对语法树处理的许多内置函数,本系统中用到python的AST模块中的内置函数如表3—3所示。

Python语法和结构分析

  • Python虽然发展时间较短,但发展进程却十分迅速。开发者在设计python语言时,结合已有程序语言的优点和缺点,以“优雅”、“明确”、“简单”的设计理念对python进行设计。因此,python程序语言的语法和结构都比较简单、清晰、明了。

Python语法分析

  • 主要选取标识符、关键字、行和缩进、空行、代码组、注释这几个方面对Python语言的语法进行分析介绍。

    • (1)标识符:同大部分编程语言一样,python中的标识符的组成元素有字母、数字和下划线。

    • (2)Python中的关键字不能用于变量的名字使用,Python中的关键字由小写字母组成,不含大写字母。Python中的关键字如表4—1所示。

    • (3)行和缩进:python不同与程序语言用大括号{}来对程序的逻辑进行区分,在python中主要用缩进对程序的逻辑进行区分。通过缩进的空白数量来对逻辑的的主次进行区别,缩进的空白数量都是可调整的,但是对应逻辑模块的缩进空白数量应保持一致。

    • (4)空行:Python中主要用空行来区分函数或者类,以突出各个方法之问的区别。也可以把空行的作用理解为:对具有功能差异的代码行进行区分。

    • (5)代码组:Python中用缩进对代码中的逻辑块进行区分,这样的逻辑模块也成为代码组。代码组通常位于循环、条结构、函数、类等的结构内部,这些结构通常以关键字开头,以冒号(:)结尾。代码组都是这些结构之后具有相同缩进语句的组合。

    • (6)注释:python中没有区块注释,只有单行注释,单行注释以“#”作为开始,“#”之后的就是注释语句。

Python结构分析

  • 顺序结构、选择结构、循环结构是所有程序语言中最基本也是最重要的结构。本文结合Python程序语言的设计规则,对Python程序语言这三种结构分析如下:

    • (1)顺序结构

      顺序结构是这三种结构中最简单的一种结构,顺序结构的执行顺序是按照程序语句书写的顺序,自上而下,逐行执行。每一个程序执行都有一个执行入口,不同程序语言的程序入口的写法不一样,Python程序语言的程序执行入口写法为“if name_=‘一main一’:”。

    • (2)选择结构

      选择结构主要利用判断条件来判定是否执行后续程序。如果判断条件为真,那么后续程序就继续执行;反之,则不执行。Python中的选择结构也是通过用if语句来对程序的执行进行控制。执行if语句时,先对if后的“条件语句”进行判断,若条件语句为真,就执行if之后的代码组;若条件语句为假,就执行else之后的代码组。

    • (3)循环结构

      循环结构主要用于控制在循环结构中的代码多次执行。Python中的循环结构有for循环和while循环,并不像其他程序语言一样也支持do.while循环。Python中循环结构的详尽描素如表4-2所示:

在循环结构中,语句的执行顺序并不是一成不变的,可以通过循环控制语句进行控制。Python语言中循环结构的控制语句如表4—3所示。

Python语言的语法和结构远不止本文所提到的这些,本文只是挑选了Python中常见的语法信息和结构信息做了描述,在整个系统设计之前,必须得对Python语言的语法和结构有一个详细的了解的认识,才能顺利的进入下一步的工作。

Python冗余信息去除模块

  • 为了减小程序代码文件的大小,减小系统处理程序时所占计算机内存,加快系统的运行速度。所以在系统对系统对程序代码进行查重检验之前,必须先去除程序代码中的冗余信息。这不仅能加快系统的运行速度,还能排除冗余信息对程序代码特征提取的影响。本系统主要是对Python程序代码进行相似度检测,结合Python程序语言的语法的结构,本系统对Python程序代码的注释、空A行、缩进这些冗余信息进行去除。程序代码冗余信息去除流程如图4-2所示。

Python基于程序代码的特征选取

  • 不同编程语言的各自语法特性和编写规则都存在着些许的差异,也就导致不同程序语言的语法特征和结构特征并不是完全相同的。本文结合Python语言的语法特征和结构特征,以及文本特征选取的原则,本文选取了Python语言中的32个元素作为Python程序代码的特征,该32个特征如表4.4所示。

  • 表4—4中的特征并不是Python语言中全部的语法特征和结构特征,结合Python程序代码的特性,本系统只是挑选了其中比较有代表性的32个特征作为Python程序代码相似度检测的特征集。当然,若是挑选的程序特征选取的越多,程序代码的相似度检测就越精确,但并不是一味的增加程序代码的特征集就能增加系统检测的精确度。这需要不断的检测和验证才能筛选出比较有代表性的特征。

基于抽象语法树特征选取

  • 抽象语法树通过对程序代码进行语法分析,把程序代码的结构信息以树节点的方式描绘出来。通过抽象语法树的处理,就可以把变量、函数、控制结构等都统一化,通过处理之后的程序源代码的语法和结构就更好的从语法树中提取出来。Python程序语言中有内置的抽象语法树模块,可以直接调用语法树模块对程序代码进行语法分析。本系统中对程序代码进行抽象语法树处理的核心代码如下:

 
 1 def save_tree(result,st):
 2  i_0
 3  tree= 4  out 2 open(result,’w+I)
 5  for i in ast.walk(st):
 6  j=j+1
 7  tree+2 str(i1
 8  out.write(str(i)+’u’
 9  out.close()
10  def file cut(file):
11  in—file=open(file,’r’);
12  source code=13  for line in in file:
14  source code+=line
15  in file.close();
16  retum source code
17  def parse—file(file,result):
18  source~code
19  2 file_cut(file)
20  st2 ast.parse(source—code)
21  save_tree(result,st)
22  1T—name一22’main'
23  py_dir—G:\similarity_check\similarity_check\word_l\\
24  dir=’G:\similarity_check\similarity_check\\word_2\\’
25  print(”Starting”1
26  for file in OS.1istdir(py_dir):
27  file-path=py_dir+file;
28  file—name
29  2
30  dir+file+’.txt’;
31  try32  parse_file(file_path,file_name);
33  except34  continue35  print(”End”)

 

  • 表4—5中的元素并不是经过语法树分析后可以出现的所有节点名字,本文通过研究对比8000多个python程序代码经语法树处理后的语法树节点,挑选了其中最常出现的32个树节点来作为程序代码的特征。

Python与mysql连接

  • 数据库是一个独立的应用软件,要实现系统和数据库之间的交互,就必须必须先研究分析在Python语言中如何与数据库进行交互。Python程序语言中提供了MySQLdb这个模块库,使得Python程序可以通过MySQLdb与MySQL数据库进行连接,以及对MySQL数据库进行操作。MySQLdb中提供了connect()方法来对MySQL数据库连接操作。连接实现代码如下:

1  conn=MySQLdb.connect(host=”主机名”,user=”用户”,passwd=”密码”,db=”数据库名”,charset=”数据库编码”)

 

Python应用

在全球气象行业中的应用

  • 区域气候中心(RCC)由美国海洋大气管理局(NOAA)下属的环境信息国家中心(NCEI)主管,提供美国6大区域的气候信息。RCC下属的应用气候信息系统(ACIS),提供基于区域的气候产品和服务,并搭建高效健壮的气候分析的计算机平台。

  • ACIS过去在数据清理,分发,存储,分析和web服务中,采用不同种类的编程语言,如Shell脚本,编译好的代码,Matlab/IDL脚本,Web服务器等,逻辑复杂,可维护性差,需要多名人员维护。现在采用Python进行统一编写,从FTP,网站等数据提取并清洗,使用Twisted模块进行数据分发,随后使用psycop92,nc,h5py分别对应存储Postgres,NetCDF,HDF5格式的数据。最终使用NumPy,Scipy,Matplotlib,Cpython进行数据处理,得到统计数据和图像等服务产品,最后使用Twisted构建Web网站供用户使用,为了提高系统响应速度还采用Redis缓存。统一的Python工作流程,摆脱了过去多编程语言带来的学习成本,降低了维护成本,编写新的业务逻辑更为简单,使得ACIS系统变得灵活、强壮。

  • 美国海军实验室(NRL)和美国海军数值气象与海洋中心,基于Python和众多模块,开发了资料同化系统的监控套件,能够监控卫星观、狈0的可用性和卫星资料对资料同化的影响。并改善了全球预报系统的检验工具,其中不仅改善了图像输出质量,并将原有不同语言编写的工具全部使用Python重写。此外,还改善了海浪预报指导产品,用以估算海盗出没的区域,并优化了全球模式的交叉对比和评估系统。

  • 美国航空航天局(NASA)基于Python开发的一套用于大气风力分析的工具,将不同时段,不同垂直高度上的大气情况进行统一汇总,用以辅助航空器发射。

  • 澳大利亚气象局国家气候中心基于Python构建了一套动态生成等值线图的工具Contour—WMS,使用在线数据源生成基于格点的,可供地图叠加的等值线图,为Web服务提供交互式的数据可视化,从而进一步提供气候预测,历史数据查询的功能。

应用于MUSIC

  • MUSIC作为数据接口服务,提供多样的服务方式,主要有Web Services、REST,客户端SDK调用服务和脚本服务,此外提供了在线版可以方便调试和单次获取数据。其中,Web Services和REST应用常见主要是Web开发,基于HTTP协议或者XML数据格式,获取数据便捷;此外,客户端调用主要面向多频次,大数据量,如数值预报系统;脚本调用主要服务于非编程人员,只需修改参数,即可获取数据,无需额外的编程工作。

  • Web Services、REST采用HTTP协议和XML数据,适用性强,不会受限于操作系统和语言。客户端调用服务和脚本服务,支持主流的操作系统,包括Linux 32/64bit、AIX、HP-UX、Windows32/64bit等,提供包括C#、Java、c/c++、For—tran、PHP、Python等的客户端开发包。

 

 

 

 

 

 

 

 

 

posted @ 2019-07-22 19:44  刚--  阅读(184)  评论(0编辑  收藏  举报