• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Python语言介绍

Python编程 彭东稳 9年前 (2015-07-22) 25832次浏览 已收录 0个评论

一、Python语言简介

Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。吉多·范罗苏姆1989年底发明第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比3D游戏中的图形渲染模块,性能要求特别高,就可以用C++重写。

现在,全世界差不多有600多种编程语言,但流行的编程语言也就那么20来种。如果你听说过TIOBE排行榜,你就能知道编程语言的大致流行程度。这是在TIOBE上截取的最近两年最流行语言排行榜。

Python语言介绍

总的来说,这几种编程语言各有千秋。Java就不用说了,各大企业都在使用,特别在大型项目中。C语言是可以用来编写操作系统的贴近硬件的语言,所以,C语言适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言,特别在数据分析,AI,开发运维方面大有作为。

当你用一种语言开始作真正的软件开发时,你除了编写代码外,还需要很多基本的已经写好的现成的东西,来帮助你加快开发进度。比如说,要编写一个电子邮件客户端,如果先从最底层开始编写网络协议相关的代码,那估计一年半载也开发不出来。高级编程语言通常都会提供一个比较完善的基础代码库,让你能直接调用,比如,针对电子邮件协议的SMTP库,针对桌面环境的GUI库,在这些已有的代码库的基础上开发,一个电子邮件客户端几天就能开发出来。

Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。

除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。

龟叔给Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。

二、Python语言特点

  • 设计哲学

Python(英语发音:/ˈpaɪθən/)的设计哲学是优雅明确简单。因此,Perl语言中总是有多种方法来做同一件事的理念在Python开发者中通常是难以忍受的。Python开发者的哲学是用一种方法,最好是只有一种方法来做一件事”。

  • 语言类型

Python是一个高层次的结合了面向对象、解释型、动态数据类型、强类型的高级计算机程序设计语言。

Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节,类似于PHPPerl语言;

Python 是交互式语言: 这意味着,您可以在一个Python提示符,直接互动执行写你的程序;

Python 是面向对象语言这意味着Python支持面向对象的风格或代码封装在对象的编程技术;

Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏;

  • 面向对象

面向对象编程为数据和逻辑相分离的结构化和过程化编程添加了新的活力;面向对象编程支持将特定的行为、特性能与它们要处理或所代表的数据结合在一起。python的面向对象的特性是与生俱来的。Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。

  • 易用

Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作内置电池(batteries included。用Python开发,许多功能不必从零编写,直接使用现成的即可;除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。

  • 内存管理器

C或者C++最大的弊病在于内存管理是由开发者负责的。所以哪怕是对于一个很少访问、修改和管理内存的应用程序,程序员也必须在执行了基本任务之外履行这些职责。而在python中由于内存管理是由python解释器负责的,所以开发人员就可以从内存事务中解放出来,全神贯注于最直接的目标。

首选是网络应用,包括网站、后台服务等等;其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等;另外就是把其他语言开发的程序再包装起来,方便使用。

三、解释型和编译型语言

  • 编程语言

基本编程语言分为这三类:机器语言、汇编语言、高级语言。高级语言按照类型分,又分为静态语言和动态语言。但是不管静态语言还是动态语言根据编程方式又分为面向过程编程和面向对象编程。

面向过程:就是把编程立足点主要用于问题解决过程本身;也就是以指令为中心,由指令处理数据,如C、shell。

面相对象:就是把我们要实现的项目抽象为一个个对象来完成,以数据为中心,所有代码都围绕数据展开,如java、python(Python既是面向过程又是面向对象)。

python是一种解释性语言,一般来说由于不是以本地机器码运行,纯粹的解释性语言通常比编译型语言运行得慢。然而类似于javapython实际上是字节编译的,其结果就是可以生成一种近似近期语言的中间形式。这不仅改善了python的性能还同时使它保持了解释型语言的优点。

  • 解释型语言

解释器不产生目标机器代码,而是产生中间代码,这种中间代码与机器代码不同,中间代码的解释是由软件支持的,不能直接使用在硬件上。该软件解释器通常会导致执行效率较低,用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。和编译的程序不同的是解释程序的任务是逐一将源代码的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码再执行。对于解释型语言,需要一个专门的解释器来执行该程序,每条语句只有在执行是才能被翻译,这种解释型语言每执行一次就翻译一次,因而效率低下。

  • 编译型语言

CC++FortranPascalAda。由编译型语言编写的源程序需要经过编译,汇编和链接才能输出目标代码,然后由机器执行目标代码。目标代码是有机器指令组成,不能独立运行,因为源程序中可能使用了一些汇编程序不能解释引用的库函数,而库函数又不在源程序中,此时还需要链接程序完成外部引用和目标模板调用的链接任务,最后才能输出可执行代码。

四、Python解释执行原理

这里的解释执行是相对于编译执行而言的。我们都知道,使用C/C++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的机器语言,经过链接器链接之后形成了二进制的可执行文件。运行该程序的时候,就可以把二进制程序从硬盘载入到内存中并运行。

但是对于Python而言,python源码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行python文件程序的时候,python解释器将源代码转换为字节码,然后再由python解释器来执行这些字节码。这样,python就不用担心程序的编译,库的链接加载等问题了。

Python作为动态解释性语言,其运行机制可参考下图(图片来自网络,其中的“编译器”是对解释器的广义称呼):

Python语言介绍

Python是一门解释语言,但是出于效率的考虑,提供了一种编译的方法。编译之后就得到pyc文件,存储了字节码。Python这点和PHP、Java(Java解释器,java很特殊,java是需要编译的,但是没有直接编译成机器语言,而是编译成字节码,然后在Java虚拟机上用解释的方式执行字节码。Python也使用了类似的方式,先将python编译成python字节码,然后由一个专门的python字节码解释器负责解释执行字节码)很类似,但是Java与Python不同的是,Python是一个解释型的语言,所以编译字节码不是一个强制的操作,事实上,编译是一个自动的过程,一般不会在意它的存在。

我们编写的代码一般都会保存在以.py为后缀的文件中。在执行程序时,解释器逐行读取源代码并逐行解释运行。每执行一次,就重复一次这个过程,这其中耗费了大量的重复性的解释工作。为了减少这一重复性的解释工作,Python引入了pyc文件,pyc文件是将py文件的解释结果保存下来的文件,这样,下次再运行的时候就不用再解释了,直接使用pyc文件就可以了,这无疑大大提高了程序运行速度。除了效率之外,字节码的形式也增加了反向工程的难度,可以保护源代码。这个只是一定程度上的保护,但反编译还是可以的。

对于pyc文件,你必须知道以下几点:

  • 对于当前调用的主程序不会生成pyc文件;
  • 以import xxx或from xxx import xxx等方式导入主程序的模块才会生成pyc文件;
  • 每次使用pyc文件时,都会根据pyc文件的创建时间和源模块进行对比,如果源模块有修改,则重新创建pyc文件,并覆盖先前的pyc文件,如果没有修改,直接使用pyc文件代替模块;
  • pyc文件统一保存在模块所在目录的__pycache__文件夹内。

字节码

字节码(Byte-code)是一种包含执行程序、由一序列 op 代码/数据对组成的二进制文件。字节码是一种中间码,它比机器码更抽象。它经常被看作是包含一个执行程序的二进制文件,更像一个对象模型。字节码被这样叫是因为通常每个 opcode 是一字节长,但是指令码的长度是变化的。每个指令有从 0  255(或十六进制的: 00 FF)的一字节操作码,被参数例如寄存器或内存地址跟随。

五、Python内存管理机制

Python解释器是使用C语言编写的,Python变量赋值需要申请内存和释放内存;而这一系列的操作对应于解释器来说是对应C语言操作的是malloc和free操作。而malloc和free操作对于Linux系统来说是系统调用,所以程序会在用户空间和内核空间频繁切换,从而带来解释器执行效率低。另外对于频繁的小内存的申请和释放操作,Python是如何优化的呢?Python引入了内存池机制和PyObject_Malloc。

  • 内存池

预先在内存中申请一定数量的,大小相等的内存块,申请内存较小(0-256字节)从内存池中分配内存,如果内存不够,重新申请新的内存空间,这样做最显著的优势就是能够减少内存碎片,提升效率。

  • PyObject_Malloc

如果申请的内存空间小于256字节,pymalloc会在内存池中申请内存空间,大于256字节则会直接执行malloc的行为来申请内存空间。

六、Python缺点说明

任何编程语言都有缺点,Python也不例外。优点说过了,那Python有哪些缺点呢?

第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。

但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C程序的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍,但由于网络更慢,需要等待1秒,你想,用户能感觉到1.001秒和1.1秒的区别吗?这就好比F1赛车和普通的出租车在北京三环路上行驶的道理一样,虽然F1赛车理论时速高达400公里,但由于三环路堵车的时速只有20公里,因此,作为乘客,你感觉的时速永远是20公里。

第二个缺点就是代码不能加密。如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。

这个缺点仅限于你要编写的软件需要卖给别人挣钱的时候。好消息是目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站和移动应用卖服务的模式越来越多了,后一种模式不需要把源码给别人。

七、Python程序文件

Python程序可以分解成模块、语句、表达式和对象。

1)程序由模块构成

2)模块包含语句

3)语句包含表达式

4)表达式建立并处理对象

表达式是某事,而语句是做某事(即指令)”:例如3+4是某事,而print 3+4则是做某事。

<学习网站>

Python Cookbook 3中文版本:https://github.com/yidao620c/python3-cookbook

Python 3中文翻译:http://python.usyiyi.cn/translate/python_352/index.html


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (3)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!