• Python简介


    Python简介

    Python是当前非常热门、应用范围非常广、使用人员非常多的编程语言。每年都有很多的初学者开始接触并爱上Python语言。作为一门开源的编程语言,其学习教程、技术书籍有很多,各有优缺点。

    Python是一门强大的语言,可用于Web开发、自动化运维、科学计算、网络爬虫、数据分析、机器学习、深度学习等几乎所有主流应用方向。尤其是Python+Django的Web开发组合。更是开发大型新闻网站、博客系统、自动化运维凭他的最佳选择。

    Python:翻译成汉语是蟒蛇的意思,并且Python的logo也是两条缠绕在一起的蟒蛇的样子,然而Python语言和蟒蛇实际上并没有关系。

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

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

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

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

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

    一、Python的发展趋势

    前面我们说了Python诞生自1991年,算算也快30年了,比1995JAVA语言都早了4年,为何大器晚成,现在才发力。

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

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

    二、Python语言的特点

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

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

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

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

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

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

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

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

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

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

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

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

    大量的标准库和第三方库

    Python为我们提供了非常完善的基础库,覆盖了系统、网络、文件、GUI、数据库、文本处理等方方面面,这些是随同解释器默认安装的,各平台通用,无需安装第三方支持就可以完成大多数的工作。

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

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

    开源语言,发展动力巨大

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

    三、Python的应用方向

    常规软件开发

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

    科学计算

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

    自动化运维

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

     云计算

    开源云计算解决方案OpenStack就是基于Python开发的。

    Web开发

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

    网络爬虫

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

    数据分析

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

    人工智能

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

    四、Python的使用者

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

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

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

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

    五、Python的缺点

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

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

    但是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解释器或者协程机制。

    第三个不是缺点的问题是Python2和Python3的不兼容性

    六、 Python之禅

    >>> 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 )
    做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
    如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
    命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)
  • 相关阅读:
    软件工程概论---二维最大子数组和
    电梯调度之需求分析
    梦断代码读书笔记(一)
    软件工程概论---max单元测试
    软件工程概论---最大子数组的和延伸
    软件工程概论第三周测验---最大子数组
    软件工程概论第二周综合测验
    软件工程概论第二周综合测验----设计思路
    2015年上学期读书计划
    关于阅读构建之法提出的问题
  • 原文地址:https://www.cnblogs.com/xiaohei001/p/10097166.html
Copyright © 2020-2023  润新知