Python 初学者指南

发表时间: 2024-04-21 16:20

1. python 发展简史

Python 起源(1989-1991) Python的诞生可以追溯到1989年,当时Guido van Rossum在荷兰国家数学和计算机科学研究所工作时,出于对当时编程语言的不满,开始构思一种新的编程语言。他希望这种语言能够弥补C语言在异常处理和分布式操作系统支持方面的不足。

Python 初始阶段(1991-2000): Python 1.0于1994年发布,引入了lambda表达式、map、filter和reduce等函数式编程工具。Python 1.6于2000年发布,是Python 1.x系列的最后一个版本。在这个阶段主要实现了基本的语法结构、数据类型、异常处理、模块系统等特性。

Python 成熟阶段(2000年至2020年): Python 2.0于2000年发布,引入了循环引用检测垃圾回收机制和全局解释器锁(GIL)。Python 2.4于2004年发布,同年Django框架诞生。Python 2.7于2010年发布,是Python 2.x系列的最后一个版本。Python 2.7原定于2015年结束支持,后延长至2020年,并确认不会有2.8版本发布。在这个阶段主要增加了许多新功能和改进,如Unicode支持、列表推导、垃圾回收机制、生成器、装饰器、迭代器协议、新式类等

Python 3的诞生与挑战(2008-至今) 2008年,Python 3.0发布,这是Python历史上的一个重要里程碑。Python 3旨在解决Python 2中的一些设计缺陷,例如在处理整数和长整数时的不一致性。然而,由于Python 3与Python 2在语法和库兼容性上存在差异,这导致了社区的分裂,许多开发者和组织在迁移到Python 3上犹豫不决。尽管如此,Python 3的推广仍在稳步进行,Python 2的官方支持已于2020年结束,Python 3成为唯一的官方支持版本。

以下是Python 发展的历史图表:

  • 1989年:Guido van Rossum开始编写Python语言的实现。他的目标是创建一种易于阅读、易于理解和易于学习的编程语言。
  • 1991年:Python的第一个公开发布版本(0.9.0)发布。
  • 1994年:Python 1.0发布。这是第一个真正稳定的版本,并且引入了重要的特性,如模块和异常处理机制。
  • 2000年:Python 2.0发布。这个版本引入了重要的新特性,如列表推导式和垃圾回收机制的改进。
  • 2001年:Python软件基金会(Python Software Foundation,简称PSF)成立,旨在促进Python语言的开发和推广。
  • 2008年:Python 3.0发布。这个版本引入了许多不兼容的改动,以清理和改进语言的设计。
  • 2010年:Python 2.7发布。这是Python 2.x系列的最后一个版本,主要是为了给用户更多时间来迁移到Python 3.
  • 2015年:Python 3.4发布。这个版本引入了许多新特性,如异步编程和新的模块。
  • 2017年:Python 3.6发布。这个版本引入了许多新特性,如格式化字符串字面值和异步生成器。
  • 2018年:Python 3.7发布。这个版本引入了许多新特性,如数据类和上下文变量。
  • 2019年:Python 3.8发布。这个版本引入了许多新特性,如海象运算符和可调用的类型提示。
  • 2020年:Python 3.9发布。这个版本引入了许多新特性,如字典合并运算符和更好的类型提示支持。
  • 2021年:Python 3.10发布。这个版本引入了许多新特性,如模式匹配和更好的错误提示。

2. Python的特点

易读性与简洁性 Python的设计哲学强调代码的可读性,其语法清晰、结构简单,使得代码像英语句子一样易于理解。这种简洁性不仅使得新手容易上手,也使得资深开发者能够快速编写和维护代码。

广泛的标准库 Python拥有一个庞大的标准库,提供了各种模块和函数,从文件操作到网络通信,从数据库接口到图形用户界面,几乎涵盖了编程的各个方面。这使得Python能够轻松应对各种编程任务。

跨平台兼容性 Python可以在多种操作系统上运行,包括Windows、Linux和macOS,这使得Python成为跨平台应用开发的理想选择。

动态类型与自动内存管理 Python是一种动态类型语言,这意味着开发者在编写代码时不需要声明变量的类型。此外,Python还提供了自动垃圾回收机制,这简化了内存管理,减少了内存泄漏的风险。

强大的社区支持 Python拥有一个活跃的开发者社区,社区成员贡献了大量的第三方库和框架,如Django、Flask、NumPy、Pandas和TensorFlow等,这些工具极大地扩展了Python的应用范围。

多范式编程 Python支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。这使得开发者可以根据问题的特点选择最合适的编程风格。

应用领域 Python在数据科学、机器学习、网络开发、自动化、科学计算和教育等领域都有广泛的应用。它的灵活性和易用性使其成为初学者和专业开发者的首选语言。

3. 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还在其他传统或特殊行业起着重要的作用。

4. Python的使用者

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

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

在国外,更是数不胜数。谷歌的Google App Engine 、http://code.google.com[https://link.zhihu.com/?target=http%3A//code.google.com] 、Google earth 、谷歌爬虫、广告等项目都在大量使用Python进行开发。还有Facebook、Twitter等等等等。几乎所有的Linux发行版都内置Python解释器。

5. 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的不兼容性。

6. 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 )

做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)

如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)

命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)

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

7. python 程序运行机制

高级编程语言按程序执行方式可以分为编译型语言和解释型语言两种, pyhon 是一门解释型的编程语言,他具有解释型语言天生具有跨平台的能力, 只要为python提供相应平台的解释器即可运行。