Python是谁参与编写的?这门语言的发展历程如何?

2020-08-04 09:53发布

2条回答
我是大脸猫
2楼 · 2020-08-04 10:13

Python之父,荷兰人Guido van Rossum。他于1982年从阿姆斯特丹大学取得了数学和计算机硕士学位。


20世纪80年代中期,Python之父Guido van Rossum还在CWI(数学和理论计算机科学领域的研究中心,位于阿姆斯特丹)为ABC语言贡献代码。ABC语言是一个为编程初学者打造的研究项目。ABC语言给了Python之父Guido很大影响,Python从ABC语言中继承了很多东西:比如字符串、列表和字节数列都支持索引、切片排序和拼接操作。


在CWI工作了一段时间后,Guido构思了一门致力于解决问题的编程语言,他觉得现有的编程语言对非计算机专业的人十分不友好。于是,1989年12月份,为了打发无聊的圣诞节假期,Guido开始写Python的第一个版本。值得一提的是Python这个名字的由来,Python有蟒蛇的意思,但Guido起这个名字完全和蟒蛇没有关系。当Guido在实现Python的时候,他还阅读了Monty Python's Flying Circus的剧本,这是来自一部来自20世纪70年代的BBC喜剧。Guido认为他需要一个简短、独特且略显神秘的名字,因此他决定将该语言称为Python。


1991年,Python的第一个解释器诞生了。他是由C语言实现的,有很多语法来自C,又受到了很多ABC语言的影响。有很多来自ABC语言的语法,知道今天还很有争议,强制缩进就是其中之一。要知道,大多数语言都是代码风格自由的,即:不在乎缩进有多少,写在哪一行,只要有必要的空格即可。而Python是必须要有缩进的,这也导致了很多其他语言的程序员开玩笑说“Python程序员必须会要用游标卡尺。”


Python1.0版本于1994年1月发布,这个版本的主要新功能是lambda, map, filter和reduce,但是Guido不喜欢这个版本。


六年半之后的2000年10月份,Python2.0发布了。这个版本的主要新功能是内存管理和循环检测垃圾收集器以及对Unicode的支持。然而,尤为重要的变化是开发的流程的改变,Python此时有了一个更透明的社区。


2008年的12月份,Python3.0发布了。Python3.x不向后兼容Python2.x,这意味着Python3.x可能无法运行Python2.x的代码。Python3代表着Python语言的未来。


今天的Python已经进入到了3,0时代,Python的社区也在蓬勃发展,当你提出一个有关的Python问题,几乎总是有人遇到了同样的问题并已经解决了。所以,学习Python并不是很难,你只需要安装好环境----开始敲代码----遇到问题----解决问题。就是这么简单,开始学习Python之路吧。


aijingda
3楼 · 2020-08-04 10:32

Python,读作['paɪθɑn],翻译成汉语是蟒蛇的意思,并且Python的logo也是两条缠绕在一起的蟒蛇的样子,然而Python语言和蟒蛇实际上并没有一毛钱关系。

image.png-132.9kB

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

image.png-297.9kB

Python语言是由荷兰程序员Guido van Rossum,江湖人称“龟叔”,独立开发完成初版的。“龟叔”曾供职于google,现任职于dropbox 。1989年圣诞节期间,在阿姆斯特丹,为了打发圣诞节的无趣,决心开发一个新的脚本解释语言,作为ABC语言的一种继承,然后他就这么做了,并实现了(大神的能力)。之所以选中Python作为该编程语言的名字,是因为他是一个叫Monty Python喜剧团体的爱好者,其本意并不是想选条蟒蛇。

image.png-227kB

Python第一个公开发行版发行于1991年,所以这年被当作Python的诞生年。

Python 源代码遵循 GPL(GNU General Public License)协议,这是一个开源的协议,也就是说你可以免费使用和传播它,而不用担心版权的问题。

目前Python是由一个核心开发团队在维护,龟叔属于太上皇职位,仍然占据着至关重要的作用,指导其进展。

一、Python的发展趋势

image.png-49.7kB

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

image.png-64.9kB

前面我们说了Python诞生自1991年,掰掰指头算算都26年了,比1995年的JAVA语言都早了4年,为何大器晚成,现在才发力?

其一,在1990那个年代,计算机性能相比现在差很多,程序执行速度和效率很重要,快速开发不是第一要务,压榨机器性能才是。Python作为一门解释型动态语言,在解释方式上它天生就存在运行速度较慢的问题,因此不被当时编程界看好,其追求开发速度、强调简洁优雅、降低编程门槛的核心理念有点超越当时主流。而时至今日,计算机的硬件性能已经得到数量级的提高,计算能力不再是限制编程语言的最重要的因素,敏捷开发成为生产环境下对语言选择的重要因素,Python很好的满足了这一点,从而得到快速发展。

其二,Python出生不好。作为对比的JAVA出身名门,其东家为SUN,当时互联网的头号公司,类似现在Google的地位,因而得到大力推广,并且有一群能力强、专职、有组织的团队进行开发和维护,所以很快获得成功,普及开来,至今仍然霸占着编程语言的榜首位置。而Python是个人编写的,寒门出身,龟叔没有三头六臂,个人时间精力都是有限的,虽然有一些志愿者帮忙做一些事情,但无疑和JAVA的正规军相比,能量还是要差了很多,这些都导致Python在初期发展得较为缓慢,甚至到如今都还未解决其被诟病的GIL问题。

二、Python语言的特点

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

  • 简单易学:与C和Java比,Python的学习成本和难度曲线不是低一点,更适合新手入门,自底向上的技术攀爬路线。先订个小目标爬个小山,然后再往更高的山峰前进。而不像C和JAVA光语言学习本身,对于很多人来说就像珠穆朗玛峰一样高不可攀。

  • 明确优雅:Python的语法非常简洁,代码量少,非常容易编写,代码的测试、重构、维护等都非常容易。一个小小的脚本,用C可能需要1000行,用JAVA可能几百行,但是用Python往往只需要几十行!

  • 开发速度快:当前互联网企业的生命线是什么?产品开发速度!如果你的开发速度不够快,在你的产品推出之前别人家的产品已经上线了,你也就没有生存空间了,这里的真实例子数不胜数。那么,Python的开发速度说第二没人敢称第一!(不欢迎辩论^_^)

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

  • 跨平台:Python支持Windows、Linux和MAC os等主流操作系统。

  • 可移植:代码通常不需要多少改动就能移植到别的平台上使用。

  • 可扩展:Python语言本身由C语言编写而成的,你完全可以在Python中嵌入C,从而提高代码的运行速度和效率。你也可以使用C语言重写Python的任何模块,从根本上改写Python,PyPy就是这么干的。

  • 交互式:Python提供很好的人机交互界面,比如IDLE和IPython。可以从终端输入执行代码并获得结果,互动的测试和调试代码片断。

  • 解释型:Python语言在执行过程中由解释器逐行分析,逐行运行并输出结果。

  • 面向对象:Python语言具备所有的面向对象特性和功能,支持基于类的程序开发。

  • 动态语言:在运行时可以改变其结构。例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言非常具有活力。

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

Python为我们提供了非常完善的基础库,覆盖了系统、网络、文件、GUI、数据库、文本处理等方方面面,这些是随同解释器被默认安装的,各平台通用,你无需安装第三方支持就可以完成大多数工作,这一特点被形象地称作“内置电池(batteries included)”。

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

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

技术社区的存在就相当于程序员手中的指南针,没有指南针,很多时候,碰到了问题,就像无头的苍蝇只能到处乱飞,最终在茫茫的海洋中转晕致死。技术社区可以给我们对语言的学习和使用提供巨大的帮助,无论是前期的学习,还是日后的工作,只要有问题,技术社区的大牛都可以帮我们解决,有这些助力,可以帮我们更好地了解、学习和使用一门语言。技术社区同时还推动Python语言的发展方向,功能需求,促使公司企业更多的使用Python语言,招聘Python程序员。

然而、然而,上面说的是国外。在国内,好像没有比较成熟,影响范围广的Python技术社区,还是说我见识浅薄不知道而已?据本人分析,有历史原因和Python流行过程中形成的习惯等因素,国外Python高手都喜欢用邮件列表、wiki等方式进行交流,而国内喜欢的论坛、bbs等没有形成规模,所以造成现在的状况。

因此,同学们,学好英语,去和世界范围的程序员交流吧!

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

Python是基于C语言编写的,并且使用GPL开源协议,你可以免费获取它的源代码,进行学习、研究甚至改进。众人拾柴火焰高,有更多的人参与Python的开发,促使它更好的发展,被更多的应用,形成良性循环。Python为什么会越来越火就是因为它的开放性,自由性,聚起了人气,形成了社区,有很多人在其中做贡献,用的人越来越多,自然就提高了市场占有率,企业、公司、厂家就不得不使用Python,提供的Python程序员岗位就越来越多,这就是开源的力量。

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

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

三、Python的应用方向

1. 常规软件开发

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

2. 科学计算

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

image.png-329.8kB

3. 自动化运维

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

image.png-359kB

4. 云计算

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

5. WEB开发

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

6. 网络爬虫

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

image.png-194.4kB

7. 数据分析

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

image.png-180.5kB

8. 人工智能

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

image.png-393kB

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

四、Python的使用者

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

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

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

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

image.png-352.1kB

五、Python的缺点

我们光说了Python的优点,也得说说它的缺点。任何编程语言都有缺点,Python也不例外。

第一个缺点就是运行速度相对慢点,和C程序相比慢不少,这是解释型语言的通病,你的Python代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以会变慢。而C程序作为编译型语言是运行前直接编译成CPU能执行的机器码,所以非常快。(但同时你可以这么理解,C语言把费时间的活在生产上线之前先花时间干了,所以运行时就快了。)

image.png-144.4kB

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

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

前面其实我们已经提到过,早些时期CPU比较昂贵,计算资源很吃紧,内存也很贵,程序运行的速度和耗费的时间就很重要。这就是导致计算机科学致力于研究不同算法的效率的原因之一。然而,这已经不再是最重要的因素,因为现在芯片很便宜,而且运行速度有了质的提升。运行时间不再是你最贵的资源。公司最贵的资源现在是员工时间。或者换句话说,就是你。在规定时间内把事情做完比把程序变快更加重要。Python语法简洁,包含大量的标准库和第三方库,用较少的语句就可以完成其它语言上百条语句才能完成的任务,这无疑大大提高了开发的速度和效率,帮助你在尽可能短的时间内完成工作。

这里并不是说速度一点也不重要,只是说速度不再是唯一重要的东西和唯一考虑的东西。 现在,产品的研发速度远比程序运行速度更重要。在一天结束时,让你的公司存活下来或者死去的唯一事物就是产品上市时间。公司能够存活下来的唯一方法就是比你的竞争对手更快地创新。如果在你的产品上市之前,你的竞争对手已经提前上市了,那么你想出了多少好的主意也将不再重要。

  • 在整个体系中有比Python程序运行得更慢的瓶颈:

如果你在写一个网络应用程序,如web服务,很有可能的情况是,CPU时间并不是你的程序的瓶颈。当你的web服务器处理一个请求时,可能会进行几次网络调用,例如到数据库,或者像Redis这样的缓存服务器。虽然这些服务本身可能比较快速,但是对它们的网络调用却很慢。如果一个单独的CPU周期等同于1秒,那么一个从北京到上海的网络调用将相当于1年。可见网络调用是多么的慢。这说明什么呢?说明Python不是系统中最慢的那个部分,有比它慢数量级的运行瓶颈卡在系统中间,制约着整个系统的运行速度。

  • 但无论怎么样,Python慢是事实。如果你真的对提高Python运行速度有需求,你可以使用C来写,然后在Python中调用它。

  • 另外,程序员大牛Donald Knuth说过过早优化是万恶之源。在开发的中早期,追求运行速度和效率是费力不讨好的,进行敏捷开发和快速迭代才是当下软件开发的王道模式,而Python正是为此而生。

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

image.png-217.2kB

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

六、 Python之禅

最后,让我们以Python的官方格言,也就是俗称的Python之禅来结束对Python的介绍。在Python的IDLE或者交互式解释器中,输入import this,你就会看到下面的一段话:

The Zen of Python, by Tim PetersBeautiful 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的学习问题可以加下这个VX号:ujiuyewtzb。(备注:学编程)

相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问