Python介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。python的创始人为荷兰人,吉多-范罗苏姆(Guido van Rossum)。最初python被作为ABC语言的一种继承。ABC是由Guido参加设计的一种教学语言。Guido认为,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,Guido认为是其非开放造成的,于是决心在python中避免这个错误。同时,他还想实现在ABC中闪现过但未曾实现的东西。
Python在Guido手中诞生了,可以说,python是从ABC发展起来的,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。
由于python语言的简洁性、易读性以及可扩展性,在国外用python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。比如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用python语言讲授。众多开源的科学计算软件包都提供了python的调用接口。例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而python专用的科学计算扩展库就更多了,例如这3个经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为python提供了快速数组处理、数值运算以及绘图功能。因此python语言极其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。
Python特点
1.使用缩进,规范编码习惯
Python在设计上坚持了清晰划一的风格,这使得python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。python的作者有意的设计限制性很强的语言,使得不好的编程习惯都不能通过编译。其中很重要的一项就是python的缩进规则。通过强制程序员们缩进,python确实使得程序更加清晰和美观。
2. 设计哲学:优雅、明确、简单
Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计python语言时,如果面临多种选择,python开发者一般都会拒绝花哨的做法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的差异,python源代码通常被认为比Perl具备更好的可读性,并且能够支撑大规模的软件开发。这些准则被称为python格言。在python解释器内运行import this 可以获得完整的列表。
3. Python是完全面向对象的语言
函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承。有益于增强源代码的复用性。python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,python对函数式设计只提供了有限的支持。有两个标准库(functools,itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。
4. 可扩展性
Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把python作为一种“胶水语言”使用。使用python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用python或java/Go调用相应的模块。
Python用途
Python是一种解释型脚本语言,可以应用于:
Web和internet开发
科学计算和统计
人工智能
教育
桌面界面开发
软件开发
后端开发
执行
Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。这种机制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine与Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一种更高级的Virtual Machine。这里的高级并不是通常意义上的高级,不是说Python的Virtual Machine比Java或.NET的功能更强大,而是说和Java 或.NET相比,Python的Virtual Machine距离真实机器的距离更远。或者可以这么说,Python的Virtual Machine是一种抽象层次更高的Virtual Machine。基于C的Python编译出的字节码文件,通常是.pyc格式。除此之外,Python还可以以交互模式运行,比如主流操作系统Unix/Linux、Mac、Windows都可以直接在命令模式下直接运行Python交互环境。直接下达操作指令即可实现交互操作。
python编译器与解释器
一、数据的表示方式
数字的表示方式有很多种,常见的有二进制、八进制、十进制和十六进制。十进制我们都很熟悉。因为我们人有10个手指头,我们对十进制有着天然的友好度。
对于计算机,则是使用二进制。因为计算机最小的计算单元是根据开关状态高低电平来确定的,它只有开和关,高和低的概念,换成数学就是0和1的两种。同样的,在物理存储方面,硬盘的磁道只能区分打孔和未打孔的状态,也就是0和1两种。同事二进制便于进行加减运算和计数编码。二进制与十进制数易于互相转换。二进制便于逻辑判断(是或非),逻辑判断通常也是两种状态,这和二进制很搭配。二进制表示数据还具有抗干扰能力强,可靠性高的特点,因为当受到一定程度的电磁干扰时,只要可以分辨出它是高电平还是低电平,至于高多少或低多少并不重要,就能区分0和1,这在网络信号汇总,就是天生自带抗干扰能力。
但是在人际交流上,二进制有致命的弱点,数字的书写特别冗长,并且没有人类可读性!至于英语、函数对计算机而言更是天书。那么我们是怎么和计算机交流的呢?怎么将我们的英语或者汉语编码成计算机能够识别的二进制呢?
二、编程语言发展历程
1. 打孔纸条
我们已经知道了计算机只读懂机器语言,也就是二进制的数据表示方式,任何对它的操作和编码,最终都要统一到这上面来,然后这是一个悲伤的故事。
起初,为了让计算机按我们的想法工作,程序员不得不编写计算机可以读懂看明白执行的机器码,也就是01010101的样子,打孔字条就是这么干的。用打没打孔来代表0和1。这样虽然计算机可以无障碍阅读,但是程序员就难受了,容易出错、效率低、编写困难、维护困难,可能就是个简单的打印“hello world”就需要好几米长的字条。这是根本无法进行下去的。
2. 汇编语言
汇编语言时一种可编辑器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。也就是数据说不同平台之间不可直接移植,它是平台相关的,在这个硬件平台写的汇编程序,到另一套硬件上去是运行不了的。因为汇编语言通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序较多使用汇编语言。相比于机器码,它更偏向人类的语言习惯,更易于编写和阅读,也就是有一点抽象符号概念化了,这大大提高了编程效率。但是,这依然是一种低级语言,还有改善和提高的空间。
3. C语言
在C语言之前其实还有很多低级语言,我们不关心它们。为了让编程更简单,更搞笑,聪明的计算机程序员,一步步发明了FORTRAN、BASIC、B等许多语言,然后在1972年诞生了无人不知,应用最广,影响最深,至今仍然地位不可动摇的C语言。
C语言为什么这么厉害?归根结底是一句话:直接操作硬件!同样的算法,用C语言,其执行效率超过JAVA等语言很多。那可能有人会问,C和汇编和机器码比呢?肯定是C慢,但是写个汇编程序和写个C程序的效率差别那就更大了。C语言在人类友好性和底层相关性上达到了一个高度的平衡。这两者是互相矛盾的,不可同时兼得的。
C干了些什么?其实它就是在人类友好性方面相比以前跨出了更大一步。人类是方便了,可机器就迷糊了!你给我这么多字符都是啥意思?机器它只懂二级制啊!难么C的代码是如何被执行的呢?这就得请出编译器了!
编译器将编程语言写的代码翻译成机器能够执行或者说“看懂”的二级制机器码。
其实我们安装JAVA也好,C也好,Python也罢,主要就是安装这个编程语言的“编译器”。
4. Python语言
在几十年前,C语言时当之无愧的高级语言带边,现在也依然是语言排行榜第二的霸主。然后,在很多领域,它已经不太实用了,现今更主流的语言是那些上手快、简单易懂,说白了就是门槛低的语言,让更多的人能进入程序员行业,让编程能更容易、更快是未来的发展趋势。也就是说,需要进一步让编程语言更贴近人类语言,更远离机器语言。
三、编译器与解释器
编译器/解释器:高级语言与机器之间的翻译官
都是将代码翻译成机器可以执行的二进制机器码,只不过在运行原理和翻译过程有不同而已。用一个通俗的例子进行比喻:我们去饭馆吃饭,点了八菜一汤。编译器的方式就是厨师把所有的菜给你全做好了,一起给你端上来,至于你在哪吃,怎么吃,随便。解释器的方式就是厨师做好一个菜给你上一个菜,你就吃这个菜,而且必须在饭店里吃。
1. 编译器:先整体编译在执行
编译方式:运行速度快,但任何一个小改动都需要整体重新编译。可脱离编译环境运行。代表语言是C语言。
2. 解释器:边解释边执行
解释方式:运行速度慢,但部分改动不需要整体重新编译,不可脱离解释器环境运行。代表语言是Python语言。
四、Python解释器种类
Python有好几种版本的解释器:
CPython
官方版本的解释器。这个解释器是用C语言开发的,所以叫CPython。CPython是使用最广的Python解释器。我们通常说的、下载的、讨论的、使用的都是这个解释器。
IPython
基于CPython之上的一个交互式解释器,在交互方式上有所增强,执行Python代码的功能和CPython是完全一样的。CPython用>>>作为提示符,而IPython用In[序号]:作为提示符。
PyPy
一个追求执行速度的Python解释器。采用JIT技术,对Python代码进行动态编译(注意:不是解释),可以显著提高python代码的执行速度。绝大部分的CPython代码都可以在PyPy下运行,但还是有一些不同,这就导致相同的python代码在两种解释器下执行可能会有不同的结果。
Jython
运行在java平台上的Python解释器,可以直接把python代码编程Java字节码执行。
IronPython
和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
五、Python的运行机制
Python作为动态解释性语言,其运行机制可参考下图(图片来自网络,其中的“编译器”是对解释器的广义称呼):
都说解释器慢,python也有想办法提高一下运行速度,那就是使用pyc文件。这点参考了JAVA的字节码做法,但并不完全雷同。
我们编写的代码一般都会保存在以.py为后缀的文件中。在执行程序时,解释器逐行读取源代码并逐行解释运行。每执行一次,就重复一次这个过程,这其中耗费了大量的重复性的解释工作。为了减少这一重复性的解释工作,python引入了pyc文件,pyc文件是将py文件的解释结果保存下来的文件,这样,下次再运行的时候就不用解释了,直接使用pyc文件就可以了,这大大提高了程序运行速度。
对于pyc文件,必须知道一下几点:
对于当前调用的主程序不会生成pyc文件;
以import xxx 或 from xxx import xxx等方式导入主程序的模块才会生成pyc文件;
每次使用pyc文件时,都会根据pyc文件的创建时间和源模块进行对比,如果源模块有修改,则重新创建pyc文件,并覆盖先前的pyc文件,如果没有修改,直接使用pyc文件代替模块;
Pyc文件统一保存在模块所在目录的pycache文件夹内。
如下图所示,module_a被module_main导入后会生成对应的pyc文件,但是modul_main不会生成pyc文件!