Python 问答环节
如果你已经买了本书,就可能已经知道 Python 是什么并且为什么它是一个需要学习的重要工具。如果没有,你很不能不会被 Python 打动,直到你通过阅读本书剩余部分学习了这门语言并完成了一两个项目。但在我们详细讲解前,本书的第一章将介绍 Python 热度后面的一些主要原因。为了开始精确给出 Python 的定义,本章采取了问答环节的形式,正式提出了被初学者问到的最常见问题以供探讨。为什么人们使用 Python?
因为当前有许多编程语言可用,这通常是初学者的第一个问题。考虑到目前大约有一百万 Python 用户,真的没有办法完全准确的回答这个问题;开发工具的选择有时基于用户独特的限制或个人偏好。 但在过去 16 年向大约 260 个团体和超过 4000 名学生讲授 Python 后,我已经看到了一些共同的主题浮现出来。被 Python 用户提及的关键因素似乎是这些:软件质量
对于许多人来说,Python 关注可读性、一致性、软件质量,这使得它不同于脚本世界的其它工具。Python 代码旨在易读,因此可重用和可维护 —— 比传统的脚本语言要好得多。Python 语言的一致性使得它容易理解 —— 即使你不编写它。另外,Python 对更高级的软件重用机制有深入支持,比如面向对象(OO)和函数式编程。开发者生产力
相比编译型和静态类型的语言如 C,C++ 和 Java 来说, Python 将开发者效率提升了许多倍。Python 代码长度是同等功能的 C++ 或 Java 代码的 1/3 到 1/5。这意味着输入更少,出错更少,事后的维护也更少。Python 程序还可以立即执行,而没有其它工具所需要的繁复的编译和链接步骤,进一步提升了程序员的速度。
程序可移植性
大部分的 Python 程序都可以在所有主流电脑平台上运行而不需要修改。比如,在 Linux 和 windows 之间移植代码通常只是需要在不同机器之间拷贝脚本代码。而且 Python 提供了多个选项来编写可移植的图形用户界面,数据库访问程序,基于 web 的系统等。甚至操作系统界面(包含程序启动和目录访问)在 Python 里也是尽可能可移植的。支持的库
Python 自带许多预构建和可移植的功能,被叫做标准库。这个库支持许多应用编程任务,从文本模式匹配到网络脚本。另外, Python 还可以用自己制作的库和广大的第三方应用支持软件来扩展。 Python 的第三方库及软件提供了网站构建,数字编程,串口访问,游戏开发等工具(参见后面的样例)。比如,NumPy 扩展已经被描述为一个比 Matlab 数字编程系统更强大而且免费的等效产品。组件集成
使用许多集成机制,Python 脚本能很容易地和应用的其它部分发生交互。这些集成允许 Python 被用作一个产品自定义和扩展工具。目前 Python 代码能调用 C 和 C++ 的库,也能从 C 和 C++ 的程序中调用,它能与 Java 和 .NET 组件集成,能通过 COM 和 SilverLight 这样的框架进行通信,能通过串口与设备连接,能使用像 SOAP、XML-RPC 和 CORBA 这样的接口在网络中进行交互。它不是一个单独使用的工具,与其它组件集成会更好地发挥作用。乐趣
因为 Python 易于使用和内置的工具集,它使得编程变得乐趣多于枯燥。虽然这是一个无形的好处,但是它对生产力的好处是很重要的。 在这些因素中,前两个(质量和生产力)可能是大部分 Python 用户最关心的好处,值得全面的描述。为什么人们使用 Python?—— 软件质量
软件质量
Python 是故意实现了简单可读的语法和高度一致的编程模型。就像以前一个 Python 会议的口号证明的那样,最终结果是 Python 似乎 “适合你的大脑”—— 也就是,语言的特性以一致和有限的方式进行交互,并且从一小组核心概念自然地延伸出来,这使得语言更容易学习、理解和记忆。在实践中, Python 程序员在读写代码的时候不需要不断地去参考手册。它是一个设计一致的系统,以至于许多人发现产生了令人惊讶的一致代码。 在哲学上, Python 采用了一个有点极简主义的方法。这意味着,虽然通常完成一个编程任务有多种方法,但是通常只有一个自然的方法,一些不太明显的替代方法和在语言中无处不在的少数交互(解决问题的一致方法)。并且 Python 不会为你做出任何的决定。当交互是模糊的时候,明确的干预比 “魔法” 更可取。以 Python 的方式思考,显式比隐式更好,简单比复杂更好 [4]。 除了这些设计主题(简洁易读和一致性),Python 包括如模块和 OOP 这样自然促进代码可重用性的工具,并且因为 Python 关注质量,所以很自然 Python 程序员也是这样。注 [4]:为了更全面地了解 Python 哲学,在任意的 Python 交互提示光标处,键入命令
<font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">import this</font>
,这会调用 Python 中隐藏的一个复活节彩蛋 —— 隐藏在 Python 下面的一系列的设计理念,它们遍布整个语言和它的用户社区。在其中,首字母缩写词 EIBTI 是 “显式比隐式更好” 规则的当前的流行行话。这些原则不是宗教信仰,但是已经近似于 Python 的箴言和信念,我们会在本书中经常引用它们。
本文章首发在 LearnKu.com 网站上。
$ python
Python 3.10.8 (main, Oct 13 2022, 10:17:43) [Clang 14.0.0 (clang-1400.0.29.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 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?—— 开发者生产力
开发者生产力
在 90 年代中后期的 Internet 大发展中,很难找到足够的实施软件项目的程序员,开发者被要求实现与互联网发展一样快的系统。在随后的大裁员和经济萧条时期,情况发生了改变。编程人员经常被要求用更少的人力实现完成同样的任务。 在这两种场景中, Python 都作为一种闪亮的工具,允许程序员使用更少的努力完成更多事情。它故意为开发速度而优化,语法简单,动态类型,没有编译步骤,内置的工具集使得程序员以其它工具所需时间的一小部分来开发程序。最终的结果是, Python 经常比传统的语言提升了开发者生产力许多倍,在蓬勃发展和经济萧条时期,还有软件行业发展到这两个极端情况之间的任何时期,对 Python 来说都是好消息,就说明 Python 是一种Python 是一门“脚本语言”吗?
Python 是一门通用的编程语言,通常应用于脚本角色。它通常定义为一门面向对象的脚本语言 —— 这个定义混合了对 OOP 的支持和对脚本角色的全面定位。如果非要用一句话来讲,我会说 Python 可能广为人知的作为一门通用的编程语言。它融合了面向过程、面向函数、面向对象的编程范式 —— 这句话概括了当前 Python 的丰富性和范围。 尽管如此,“脚本” 这个术语仍然像胶水一样的粘在 Python 上,可能是和其它工具所需的更大编程努力所区分。比如,人们通常使用单词 “脚本” 来代替 “程序” 来描述一个 Python 代码文件。为了和这个传统一致,本书交替使用术语 “脚本” 和 “程序”,同时有一个轻微的偏好:用 “脚本” 来描述一个更简单的顶层文件,“程序” 用来指一个更复杂的多文件应用。 然而,因为术语 “脚本语言” 对不同的观察者有许多不同的意义。一些人更倾向于这个术语根本不要用于 Python。事实上,当人们听到 Python 给到如下标签的时候,通常倾向于做出三种非常不同的联想,其中一些比另一些更有用 :shell 工具
有时,当人们听到 Python 被描述为一门脚本语言时,认为这意味着 Python 是一个编写面向操作系统脚本的工具。那些程序通常从控制台命令行启动,执行像处理文本文件和启动其它程序的任务。 Python 程序可以而且确实扮演这样的角色,但是这只是几十个常见 Python 应用领域中的一个。它不仅仅是一个更好的 shell 脚本语言。控制语言
对另一些人来说,脚本意味着是用来控制和管理(也就是脚本化)其它应用组件的胶水层。 Python 程序确实经常部署在更大应用的上下文中,比如为了测试硬件设备, Python 程序可能会调用提供对设备的低级访问权限的组件。同样,程序可以在重要的位置运行 Python 代码来支持终端用户的产品自定义,而无需重新发布和重新编译整个系统的源代码。 Python 的简洁性使得它是一个自然的灵活的控制工具。虽然,技术上讲,这也仅仅是一个常见的 Python 作用。许多人(可能是大多数) Python 程序员甚至从来没有使用或者不知道其它集成组件,而只是在编写单独的脚本。它不仅仅是一个控制语言。易于使用
可能理解术语 “脚本语言” 的最佳方式就是它指一个用来快速编码任务的简单语言。当这个术语用在 Python 身上时尤其如此。 Python 允许比如 C++ 这种编译化语言快得多的程序开发速度。它的快速开发周期促进了一种探索性的、增量式的编程模式。这种模式只有经历过才会被欣赏。然而,不要被骗了,Python 不仅仅只用于简单的任务。更准确地说,它通过自己的简单、易用和灵活使任务变得简单。 Python 有一个简单的功能集,但它允许程序按需扩展其复杂性。正因为如此,它通常用于快速战术任务和长期的战略发展。 所以, Python 是一门脚本语言吗?这取决于你问的是谁。通常,术语 “脚本” 可能最好用来描述 Python 所支持的快速和灵活发展开发模式,而非一个特殊的应用领域。 本文章首发在 LearnKu.com 网站上。
** **的语言。
w 好的,但缺点是什么?
在使用 Python 21 年,撰写相关文章 18 年,讲授它 16 年后,我发现, Python 唯一显著通用的缺点就是目前的实现方案的执行速度可能不会总是像全编译和底层语言如 C、 C++ 那么快。虽然目前这种情况相对少,但对一些任务,仍然可能偶尔需要使用底层语言(更直接映射到底层硬件架构上)来达到 “更接近底层硬件” 的目的。 在本书,我们稍后将谈论实现概念的细节。总之,当前 Python 的标准实现是将源码语句编译(也就是翻译)成一个名为字节码的中间格式,然后再解释字节码。字节码提供了可移植性。它是平台无关格式。然而,因为 Python 通常不会一直编译到二进制代码(如对英特尔芯片的指引),一些程序在 Python 中将会比在全编译语言如 C 中运行的更慢。 在下一章讨论的 PyPy 系统能够通过在程序运行时进一步编译,在一些代码上达到 10 倍和到 100 倍的速度提升。但是,它是一个独立的,可选的实现。 是否关注执行速度的差别,取决于写的是哪种程序。 Python 已经优化过许多次。在大部分的应用领域, Python 独自运行得足够快。而且,只要当你在开始你脚本中做一些 “实际的” 事情,比如处理一个文件,或者构建一个图形用户界面(GUI),你的程序实际上将是在 C 的速度运行。这些任务会立即分配给 Python 解释器内部的编译好的 C 代码。更重要的是, Python 快速开发的优势通常远比任何执行速度上的损失要重要得多 —— 特别是考虑到现代计算机的速度。 然而,即使在当前的 CPU 速度,仍然有一些领域确实需要优化执行速度。比如数字编程和动画,它们的核心数字组件经常需要运行在至少 C 的速度(甚至更好)。如果你在这个领域工作,你仍然可以使用 Python—— 简单地将需要优化速度的应用程序的部分分割到编译的插件中,然后将它们链接到你的系统,以用于 Python 脚本。 我们不会在本书中谈论很多扩展,但是这真的确实是我们之前讨论过的 Python 作为控制语言角色的一个实例。双重语言策略的一个重要例子是 Python 的 NumPy 数字编程扩展。通过在 Python 语言中将编译和优化好的数字扩展库结合起来, NumPy 把 Python 变成了一个高效易用的数字编程工具。当需要时,扩展提供了强大的优化工具。 本文章首发在 LearnKu.com 网站上。好的,但缺点是什么?—— 其它的Python折衷:无形的部分
我注意到执行速度是 Python 唯一的主要缺点。对大多数 Python 用户特别是新手确实如此。大多数人都发现 Python 易学,使用起来很有乐趣,特别是和它同时代的语言如 Java, C# 和 C++ 相比。然而,为了完全的公开,我还应该提前地谈一些我在 Python 世界的 20 年中观察到的更抽象的折衷 —— 作为一个教育者和开发者。作为一名教育者,我有时会发现 Python 和它的库变化的速度太快,并且有时会为它多年来的发展而感到悲伤(无能为力)。这是因为培训师和书的作者必须和这些前沿技术保持同步 —— 讲授这门语言是我的工作,尽管变化是持续的,而且这任务有时就像在记录猫群的活动一样困难。尽管如此,这仍然是一个普遍关注的问题。正如我们在本书中将看到的, Python 最初的 “保持简单” 理念现在常常被越来越复杂的方案所取代。这是以新手的学习曲线为代价的。本书的大小(1000 多页)就是这个趋势的间接证据。
另一方面,在大多数的衡量标准上, Python 仍然比它的替代语言简单得多。考虑到它今天承担的这么多的角色,或许它只是像它所需要的那么复杂。它的整体一致和开放特点对大多数人来说仍然是很有吸引力的特征。然而,并不是所有人都需要跟向跟上前沿的发展 —— 正如 Python 2.X 仍然很受欢迎一样。作为一名开发者。我有时也会质疑 Python “开箱即用” 的开发方法中固有的折衷。它对预先构建工具的强调可能会增加依赖关系(假如你使用的一个库被改变、损坏或弃用了,该怎么办?),并鼓励特殊情况的解决方案,而不是可以更好地长期服务用户的通用原则(如果你不了解一个工具的目的,怎么去评估和使用它?)。我们将在本书中看到这两个问题的例子。
对于普通的用户,特别是爱好者,对于爱好者和初学者,Python 工具集方法是一个主要优点。但当你的水平已超出预编码的工具时,你不应该感到惊讶,并且可以从本书旨在传授的技能中受益。或者换句话来说,给人们一个工具,他们会编码一天,教他们如何构建工具,他们会编码一辈子。本书的工作更多的是后者,而不是前者。 就像本章其它地方提到的, Python 和它的工具箱模型也容易受到开源项目中普遍存在的缺点的影响 —— 少数人的个人偏好可能会胜过许多人的普遍习惯,以及混乱甚至精英主义的偶尔出现 —— 尽管这些问题通常在新版本发布的前沿表现得最为严重。 在本书的末尾,在掌握了足够的 Python 知识能够得出自己的结论后,我们再回来讨论这些折衷。作为一个开源系统, Python 是什么取决于它的用户。最后,Python 今天比以任何时候都更受欢迎。它的增长没有减缓的迹象。对一些人来说,这可能是一个比个人意见(不管是支持还是反对)更有说服力的指标。 本文章首发在 LearnKu.com 网站上。