No Starch Press 出版的《 Python Playground 》一书囊括的项目主题广泛,且为数众多,该书旨在展示 Python 是如何运用在这些不同内容主题上的,包括创建 ASCII art、飞鸟仿真、连接的 Raspberry Pi 的接口及其它。InfoQ 采访了书的作者 Mahesh Venkitachalam。
确切地说,《Python Playground》不是一本 Python 语言的入门读物,它面向的是已能熟练使用 Python 且打算进一步提升自身 Python 使用技巧和知识的程序员。不过该书在解释所有相关细节方面做得相当不错,读者能很清楚地明白其中的来龙去脉。
书中每一章节对应一个项目。作者首先对项目的内容和解决方案进行初步介绍,然后详尽地讲解实现代码,在此基础上最后抛出一些试验例子以供读者自行完成。由于书籍的撰写结构良好,阅读该书无需依照特定顺序,读者可以直接切入到自己想读的任一项目章节中去,没有任何其它具体前置要求。
以下是该书涉及到的项目列表:
- iTunes 播放列表,重点关注 XML 和 plist 文件、列表和字典、图表和散点图等。
- Spirographs,展示了如何创建参数化图形、设置效果以及保存为文件。
- 康威生命游戏(Conway’s game of life),介绍了使用 matplotlib 表征及驱动数据网格,还有 numpy 和随机分布。
- Musical overtones,展示了如何实现循环缓冲区、播放 WAV 文件以及画图。
- 飞鸟仿真(Birds simulation),关注点再次聚集于 numpy、matplotlib 等。
- ASCII art,介绍了灰度图像处理的相关内容。
- Photomosaic,介绍了 RGB 图像处理的相关内容。
- Austereograms,使用二维图像制造三维幻觉。
- OpenGL,展示了 OpenGL 在 Python 中的基础使用。
- 粒子系统(Particle systems),在 OpenGL 使用技巧的基础上进一步介绍了混合、depth masks、alpha 通道、相机的使用。
- 体绘制(Volume rendering),介绍了 OpenGL 着色器。
- Arduino intro,手把手指导读者黑掉 Arduino 单片机。
- 激光音频显示器,Arduino 的进阶章节,通过使用激光和双转镜获得生成模式。这个项目包括了应用实时 FFT 音频数据分析法来驱动电机的内容。
- Raspberry Pi,介绍了 Raspberry Pi,以及通过 Python 与温湿度传感器交互。
正如以上列表所清晰展示的,该书的目标之一即是通过尽可能地展示多种多样的案例,来表明 Python 在实际应用中的广泛性。颇有意思的是,为了让读者能够构建更多的专属硬件接口项目,该书最后一章还回顾了电子工程实践基础知识,包括常用组件、工具、电路搭建等。
InfoQ:请您谈一下写作这本书的目的。为什么一定要写这本书?
在很长一段时间里,我是一名 C++ 程序员。几年以前,我开始使用 Python 来完成一些自动化工作。很快,我发现 Python 已经成为我用于计算的唯一称手工具。很多时候使用 Python 可以快速地完成想法初验,而不用写 C++ 代码。我重新找回了编程的快乐。当我开始积累了一系列探索性的使用 Python 编程的项目经验时,我想这些积累也许能转化为一本不错的以项目为主题的书。
InfoQ:该书的目标群体是拥有一些 Python 编程经验的中级开发者。对于他们阅读本书您有什么样的建议?他们应期待或者不应期待什么?
市面上有很多教你学习 Python 语法和使用技巧的好书,我的书不打算做此类重复。《Python Playground》试图去回答这个疑问:“我对 Python 有一些了解。但又怎样?”这本书结合大量的项目案例介绍了在你解决特定问题或探究想法时可能会用到的库、技术和方法。所有的项目使用同样的书写结构——首先清楚地陈述问题,然后将问题分解为多个子任务,确认算法,找到合适的模块来帮助你快速形成解决方案。我希望这些项目能作为读者的跳板,帮助他们解决自己感兴趣的问题。
InfoQ:有许多针对初级开发者的 Python 书籍,也有不少专注于解决特定应用领域的高级书籍,比如关于机器学习、网络编程、科学计算等等。您的书和这些都不一样,您在书中试图覆盖的应用领域相当广泛。这么做的魅力之处是什么?
Python 这门语言的核心功能集很小——你可以很快就学会它。在此之外,Python 拥有各种类型的内置模块和第三方库,这意味着几乎在所有你想做的事情上都能找到帮手。举个例子,如果你想解析网页或是与串口进行通信,这就有现成可用的库。书中描述的具体应用对特定领域人员非常有用。不过我的目的是展示 Python 的广泛应用,描述这门语言是如何应用在诸多领域的。这对部分刚学会了 Python 但还不懂得怎么应用所学到的技术的人来说,会特别有帮助。
InfoQ:您选择项目的标准是什么?有没有哪些项目是你本想包含进来的,但出于某种原因最后放弃了?
我基于自己的个人兴趣来选择项目。很久之前,为了完成硕士学位论文,我做一些材料科学方面的计算机仿真工作——因此书中出现了 conway、boids、karplus-strong 项目。类似的情况,在过去的差不多 20 年里,我一直从事 OpenGL 相关的工作,所以会觉得写 3D 章节的内容很好玩。硬件相关的章节是源于我最近的兴趣。有些项目构思没能成功写入书中,因为我得在项目的趣味性和实现及解释项目的复杂度之间保持平衡。其中有一个没写入的项目是基于 Raspberry Pi 的机器人,另一个是关于变形预测的——可能你也看过这类街头艺术,当从某个特别的角度去看图像时,画面会产生 3D 效果。
InfoQ:您觉得哪一个项目实现起来最有趣?最难的是哪一个?
对我来说,我觉得最有趣的项目是激光音频显示器。最难实现的是体绘制(Volume rendering)项目,不过它是难在下笔时的解释说明。
InfoQ:书中还花了一整章讲硬件破解,还有一些类似 C 的编程。您觉得在诸如涉及硬件接口的应用方面,使用 Python 的优势之处在哪里?
Python 可以像接口语言一样应用在硬件上,在成熟体系的计算机上完成类似于串口通信的任务是完全可以的。你还可以在类似 Raspberry Pi 的硬件上使用 Python,它自带操作系统并对 Python 内置支持。后者的场景很吸引人,因为你可以在上面使用 Python 来直接和硬件进行对话。不过你仍然需要清楚使用 Python 这种运行于操作系统层之上的高级语言的局限性。在时效标准严苛的情况下,在和硬件打交道时通常必需使用更低级的语言比如 C 语言来编写代码。不过好消息是,一旦你完成了编码,可以很容易地创建 C 代码的 Python 绑定。举个例子,Raspberry Pi 天气状况监控项目中使用的 Adafruit DHT 库即是如此实现的。还有我想研究的 Micropython 也是这个领域令人激动的开发内容。
InfoQ:您提供的代码兼容 Python 2.7-3.3。为了让代码适用于尽可能多的受众,这样的选择不难理解。有没有出现这样的情况,也许能帮上忙的功能只在 Python 3.X 上有?您怎么看 Python 2.7/3.X 之间的割裂?
这本书基本上只使用 Python 核心功能,我把领域相关工作移交给库来处理。所以从这个意义上讲,我没有觉得自己被语言版本问题限制了。考虑到 2.7/3.3 之间的割裂,我赞成保持事情简单,我对 2.7 版本挺满意。
InfoQ:在脚本编写语言中,Python 是使用最广泛的其中之一。然后,Go 语言开始被视为大型 Python 脚本的替代物。您认为这个趋势会持续下去吗?Python 是否还会像过去十年一样,仍然是适用于解决中等到复杂项目的正确的编程语言选择?
我还没研究过 Go 语言,所以我没有太多的发言权。因为有 Google 在背后支持它,我对 Go 持欢迎态度。我认为 Python 最大的魅力在于它的简洁,这是我教 Python 10 年来最直接的感受。每天有越来越多的人开始学习编程,随着超级廉价硬件比如售价 5 美元的 Raspberry Pi Zero 计算机的出现,我认为 Python 程序员会越来越多,而不是变少。
InfoQ:以您的经验来看,近期 Python 新增的功能(异步 / 等待、类型注释、异步 IO、生成器等等)哪些能提高程序员的生产力?
在 3.x 里已经普遍使用生成器了,不过其它一些功能我认为程序员倾向于在他们有需要时才去使用,或者碰上某个特定的库或框架要求使用时才会用到。作为经历过一门复杂语言(C++)的过来人,Python 对我的吸引力还是它体现出的简单和简洁。
《Python Playground》的样章下载。
作者简介
Mahesh Venkitachalam是一名拥有 20 年编程经验的软件工程师。自八年级起,他对技术即充满激情,他名下的电子学及编程主题的博客 electronut.in 广受欢迎。
查看英文原文: No Starch Press’ Python Playground Review and Q&A with the Author
评论