Python这个单词的发音是['paɪθɑn],在汉语中被翻译为"蟒蛇"。有趣的是,Python的标志也是两条缠绕在一起的蟒蛇图案。然而,实际上Python编程语言和蟒蛇之间并没有直接的联系。Python语言是一种简单易学、高效而强大的编程语言,它具有清晰的语法结构和丰富的库。

1.png

Python的口号是:“人生苦短,我用Python!”。这条口号已经被Python业界广泛使用,快成了广告词一类的存在了。

2.png

Python语言的创始人是荷兰程序员Guido van Rossum,他在江湖中被尊称为"龟叔"。他独立开发并完成了Python的初版。曾经,"龟叔"在Google工作,目前在Dropbox任职。1989年的圣诞节期间,"龟叔"在阿姆斯特丹,为了打发无聊的假期,决定开发一种新的脚本解释语言,作为ABC语言的继承。他付诸行动,并以惊人的能力实现了这一目标。选择"Python"作为该编程语言的名称,并不是因为他想选择蟒蛇这个意象,而是因为他是Monty Python喜剧团体的忠实粉丝。

3.png

Python的第一个公开发行版发布于1991年,因此这一年被视为Python的诞生年份。

Python的源代码采用GPL(GNU General Public License)协议,这是一个开源协议,意味着您可以自由地使用和传播它,而不必担心版权问题。

目前,Python由一个核心开发团队进行维护,而"龟叔"则担任着至关重要的太上皇职位,对Python的发展起着指导作用。

一、Python的发展趋势

4.png

从上图中,我们可以看出Python在最近3年出现了井喷式的发展。下图是2017年7月的TIOBE全球编程语言热度排行榜,从中我们能看出Python已经挤下C#,强势插入第四,当之无愧的解释类型语言领头羊。

5.png

Python的大器晚成主要有两个原因。

首先,在Python诞生的1990年代,计算机性能远不及现在,程序的执行速度和效率非常重要,而快速开发并不是首要任务,更重要的是充分利用机器性能。作为一种解释型动态语言,Python天生存在运行速度较慢的问题,因此在当时的编程界并没有得到广泛认可。Python强调开发速度、简洁优雅和降低编程门槛的核心理念超越了当时主流的观念。然而,随着计算机硬件性能的飞速提升,计算能力不再是限制编程语言的最重要因素,敏捷开发成为生产环境中语言选择的关键因素。Python恰好满足了这一需求,因此得到了快速发展的机会。

其次,Python在初始阶段并不占据有利地位。与备受瞩目的Java相比,Python并没有背后的权威支持。Java由SUN公司开发,当时是互联网领域的头号公司,类似于现在的Google地位。这为Java提供了强大的推广力度,并拥有专业、有组织的团队进行开发和维护,使其迅速获得成功并广泛普及,至今仍然是编程语言的领先者。而Python是由个人编写的,起初并没有强大的支持。"龟叔"虽然有一些志愿者帮助,但与Java的正规团队相比,资源和能力上还存在差距。这导致Python在早期的发展相对缓慢,甚至至今仍未解决其备受诟病的GIL(全局解释器锁)问题。

二、Python语言的特点

1. 简单易学、明确优雅、开发速度快

  • 简单易学:与C和Java相比,Python的学习成本和难度较低,更适合新手入门,采用自底向上的技术学习路径。先制定小目标、攀登小山,然后再逐步提高,向更高的山峰挑战。相比于C和Java,Python的学习过程更像攀登珠穆朗玛峰的艰巨挑战。
  • 明确优雅:Python的语法非常简洁,代码量少,非常容易编写,代码的测试、重构、维护等都非常容易。一个小小的脚本,用C可能需要1000行,用JAVA可能几百行,但是用Python往往只需要几十行!
  • 开发速度快:当前互联网企业的生命线是什么?产品开发速度!如果你的开发速度不够快,在你的产品推出之前别人家的产品已经上线了,你也就没有生存空间了,这里的真实例子数不胜数。那么,Python的开发速度说第二没人敢称第一!(不欢迎辩论^_^)

2. 跨平台、可移植、可扩展、交互式、解释型、面向对象的动态语言

Python具有多项特性,使其成为一门受欢迎的编程语言:

跨平台:Python支持主流操作系统,如Windows、Linux和MAC OS,使开发人员能够在不同平台上进行开发和部署。

可移植:由于Python语言的高度一致性,代码通常无需大量修改即可在不同平台上运行,大大简化了跨平台开发的工作量。

可扩展:Python本身是用C语言编写的,因此可以轻松地在Python中嵌入C代码,提高代码的执行效率和性能。同时,可以使用C语言重写Python的任何模块,实现对Python的底层改写,例如PyPy项目就是利用这一特性。

交互式:Python提供了优秀的交互式编程环境,如IDLE和IPython。这使得开发人员可以在终端上输入代码并立即执行并查看结果,方便测试和调试代码片段。

解释型:Python是一种解释型语言,代码在执行过程中由解释器逐行解析和执行,无需编译过程。这种即时解释执行的方式使得开发更加灵活和高效。

面向对象:Python具备完整的面向对象特性和功能,支持基于类的程序开发。面向对象的编程范式提供了更好的模块化和代码复用机制,使得开发人员能够更好地组织和管理代码。

动态语言:Python是一种动态语言,它具有在运行时改变结构的能力。这意味着开发人员可以在程序执行过程中引入新的函数、对象或代码,甚至可以删除现有的函数或进行其他结构上的变化。这种灵活性使得Python具有高度的适应性和活力。

3. “内置电池”,大量的标准库和第三方库

Python提供了丰富的标准库和第三方库,称之为“内置电池(batteries included)”,这些库涵盖了系统操作、网络通信、文件处理、图形界面、数据库访问、文本处理等各个领域。这些库随着Python解释器一起默认安装,并且在各个平台上都通用。开发人员无需额外安装第三方支持即可完成大部分任务。这大大加快了开发速度,提高了开发效率。

在程序员界,有一句话叫做“不要重复造轮子”。什么意思呢?就是说不要做重复的开发工作,如果对某个问题已经有开源的解决方案或者说第三方库,就不要自己去开发,直接用别人的就好。不要过分迷信自己的代码能力,要知道,能作为标准库被Python内置,必然在可靠性和算法效率上达到了目前最高水平,能被广泛使用的第三方库,必然也是经受了大量的应用考验。除非公司要求,不要自己去开发,请使用现成的库。那些造轮子的事情,就交给世界最顶尖的那一波程序员去干吧,没有极致的思维和数学能力,想创造好用的轮子是很难的。

4. 社区活跃,贡献者多,互帮互助

Python技术社区的活跃度和贡献者的数量是非常令人称赞的。技术社区就像程序员的指南针,它为我们提供了学习和使用编程语言的巨大帮助。无论是在学习阶段还是工作中,只要遇到问题,技术社区中的专家都可以帮助我们解决。有了这样的支持,我们可以更好地了解、学习和应用一门语言。技术社区还推动着Python语言的发展方向和功能需求,促使更多的公司和企业使用Python,并增加对Python程序员的招聘需求。

然而,上面提到的是国外的情况。在国内,似乎还没有像国外那样成熟且影响广泛的Python技术社区。可能是由于历史原因和Python在国内的普及过程中形成的习惯等因素。国外的Python专家更倾向于使用邮件列表、维基等方式进行交流,而国内更喜欢使用论坛、BBS等方式,但没有形成规模化的社区。这可能是导致当前情况的原因。

因此,同学们,学好英语,去和全球范围的程序员进行交流吧!

5. 开源语言,发展动力巨大

Python作为一种开源语言,具有巨大的发展动力。Python是基于C语言编写的,并采用GPL开源协议,这意味着你可以免费获取Python的源代码,进行学习、研究甚至改进。众人拾柴火焰高,有越来越多的人参与Python的开发,推动其更好地发展和广泛应用,形成良性循环。Python之所以越来越受欢迎,正是因为它的开放性和自由性,吸引了大量的用户并形成了强大的社区。随着使用Python的人数不断增加,Python的市场占有率也得到提高,企业、公司和厂家不得不使用Python,并提供越来越多的Python程序员岗位。这正是开源的力量所在。

这里附带跟大家说一个代码封闭的问题。Python写的源代码通常是不加密的,如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码基本是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。如果你不想让别人看到或抄袭你写的python代码怎么办?使用类似py2exe的包装工具,将python源码转换成一个类似于exe可执行文件的形式,但这个也不是绝对保险,只是增加了反编译的门槛和难度,对于有经验的人而言,一样可以获得你的源代码。

你可能要问,我要通过写代码编软件卖出去挣钱怎么办?少年!目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站服务和移动应用卖服务的模式越来越多了,这种模式不需要把源码给别人。再说了,现在如火如荼的开源运动和互联网自由开放的精神是一致的,互联网上有无数非常优秀的像Linux生态圈一样的开源项目,我们千万不要高估自己写的代码真的有非常大的“商业价值”。在Python的世界,开源是王道,不要纠结你的代码被抄袭模仿,而是尽量提高自己的水平和能力,这才是立身之本。

三、Python的应用方向

1. 常规软件开发

Python支持函数式编程和OOP面向对象编程,能够承担任何种类软件的开发工作,因此常规的软件开发、脚本编写、网络编程等都属于标配能力。

6.png

2. 科学计算

随着NumPy, SciPy, Matplotlib, Enthought librarys等众多程序库的开发,Python越来越适合于做科学计算、绘制高质量的2D和3D图像。和科学计算领域最流行的商业软件Matlab相比,Python是一门通用的程序设计语言,比Matlab所采用的脚本语言的应用范围更广泛,有更多的程序库的支持。虽然Matlab中的许多高级功能和toolbox目前还是无法替代的,不过在日常的科研开发之中仍然有很多的工作是可以用Python代劳的。

7.png

3. 自动化运维

这几乎是Python应用的自留地,作为运维工程师首选的编程语言,Python在自动化运维方面已经深入人心,比如Saltstack和Ansible都是大名鼎鼎的自动化平台。

8.png

4. 云计算

开源云计算解决方案OpenStack就是基于Python开发的,搞云计算的同学都懂的。

9.png

5. WEB开发

基于Python的Web开发框架不要太多,比如耳熟能详的Django,还有Tornado,Flask。其中的Python+Django架构,应用范围非常广,开发速度非常快,学习门槛也很低,能够帮助你快速的搭建起可用的WEB服务。

10.png

6. 网络爬虫

也称网络蜘蛛,是大数据行业获取数据的核心工具。没有网络爬虫自动地、不分昼夜地、高智能地在互联网上爬取免费的数据,那些大数据相关的公司恐怕要少四分之三。能够编写网络爬虫的编程语言有不少,但Python绝对是其中的主流之一,其Scripy爬虫框架应用非常广泛。

11.png

7. 数据分析

在大量数据的基础上,结合科学计算、机器学习等技术,对数据进行清洗、去重、规格化和针对性的分析是大数据行业的基石。Python是数据分析的主流语言之一。

12.png

8. 人工智能

Python在人工智能大范畴领域内的机器学习、神经网络、深度学习等方面都是主流的编程语言,得到广泛的支持和应用。

13.png

当然,除了以上的主流和前沿领域,Python还在其他传统或特殊行业起着重要的作用。

四、Python的使用者

说了这么多先进的当下最前沿的Python技术方向,那么有哪些公司在使用Python呢?

在国内最有名的就是知乎和豆瓣了,它们就是基于Python开发的Web服务。其它的例如百度、阿里、淘宝 、搜狐、金山、腾讯、盛大、网易、土豆、新浪、果壳等公司都在使用Python完成各种各样的任务,几乎所有的互联网企业都在招聘Python程序员。

在国外,更是数不胜数。谷歌的Google App Engine 、code.google.com 、Google earth 、谷歌爬虫、广告等项目都在大量使用Python进行开发。还有Facebook、Twitter等等等等。几乎所有的Linux发行版都内置Python解释器。

下面是一张不完全的统计图:

14.png

五、Python的缺点

除了讨论Python的优点,我们也应该提及它的一些缺点。就像任何编程语言一样,Python也有其不足之处。

首先,相对于其他编程语言如C,Python的运行速度较慢。这是解释型语言的共性问题。在执行Python代码时,它会逐行地转换为CPU能够理解的机器码,这个翻译过程非常耗时,因此导致了运行速度的下降。相比之下,C作为编译型语言,可以在运行之前直接将代码编译成CPU可以执行的机器码,因此速度非常快。(但需要注意的是,可以这样理解:C语言在生产上线之前将耗时的编译工作完成,从而在运行时获得快速执行的优势。)

15.png

但是Python的慢,没有你想象中的那么严重那么重要,因为:

  • 程序速度不再那么重要,不一定非要追求极致:

正如之前提到的,过去计算机资源非常昂贵,CPU和内存都是宝贵的资源。因此,在早期的计算机科学中,算法的效率是一个非常重要的研究方向。然而,随着现代技术的进步,芯片变得更加便宜且运行速度显著提高,计算机运行速度不再是最重要的因素。现在,公司最宝贵的资源是员工的时间,也就是你的时间。在规定的时间内完成工作比提高程序的运行速度更加重要。

Python的语法简洁,并且拥有大量的标准库和第三方库,使用少量的代码就能完成其他编程语言需要大量代码才能实现的任务。这大大提高了开发的速度和效率,帮助你在尽可能短的时间内完成工作。

这并不是说速度完全不重要,而是速度不再是唯一重要的考虑因素。现在,产品的开发速度比程序的运行速度更为关键。在一天结束时,能否让你的公司生存下来的唯一因素就是产品的上市时间。公司能够生存下来的唯一途径就是比竞争对手更快地创新。如果你的竞争对手在你的产品上市之前就已经上市了,那么无论你有多少好主意也不再重要。

此外,在整个系统中可能存在比Python程序运行更慢的瓶颈。例如,在编写网络应用程序(如Web服务)时,CPU时间往往不是程序的瓶颈。在处理请求时,可能需要进行多次网络调用,如数据库查询或缓存服务器(如Redis)访问。尽管这些服务本身可能很快,但网络调用的速度相对较慢。如果一个CPU周期等于1秒,那么一个从北京到上海的网络调用就相当于1年的时间。这说明Python并不是系统中运行最慢的部分,存在比它慢几个数量级的瓶颈问题,限制了整个系统的运行速度。

然而,不可否认的是,Python的运行速度相对较慢。如果你确实需要提高Python的运行速度,可以使用C语言编写相关部分,并在Python中进行调用。

  • 但无论怎么样,Python慢是事实。如果你真的对提高Python运行速度有需求,你可以使用C来写,然后在Python中调用它。
  • 另外,程序员大牛Donald Knuth说过过早优化是万恶之源。在开发的中早期,追求运行速度和效率是费力不讨好的,进行敏捷开发和快速迭代才是当下软件开发的王道模式,而Python正是为此而生。

第二个问题就是GIL(Global Interpreter Lock)全局解释器锁,这是一种防止多线程并发执行机器码的互斥锁,功能和性能之间权衡后的产物。这是在设计Python语言的时候留下的一个历史性遗留问题,也是限于当时技术团队实力有限。具体的技术细节先不解释,其造成的后果就是Python在进行多线程任务的时候,其实是伪多线程,性能较差,这一点一直被诟病,大家随便在某个技术论坛里都能找到对这个问题的激烈讨论。Python的这个问题事实存在,一段时间内也是无法解决的,为什么呢?这需要从底层重新设计Python,难度之大,工作量之大,对现有生态圈的影响非常巨大。那么有什么解决办法?使用非官方的PyPy解释器或者协程机制。

16.png

第三个不是缺点的问题是Python2和Python3的不兼容性。在后面会有论述。

六、 Python之禅

最后,让我们以Python的官方格言,也就是俗称的Python之禅来结束对Python的介绍。在Python的IDLE或者交互式解释器中,输入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!

翻译过来的意思就是:

优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)
当存在多种可能,不要尝试去猜测而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)

如果你深入理解并实践了以上的精神,可以肯定的是你的代码水平会得到极大的提高!

标签: python, python下载, Python教程, Python技术, Python学习, Python学习教程, Python语言, Python开发, Python入门教程, Python进阶教程, Python高级教程, Python面试题, Python笔试题, Python编程思想