前言
欢迎阅读本书!本书提供15个令人兴奋的项目,旨在鼓励读者探索Python编程世界。这些项目涵盖各种主题,如绘制繁花曲线图案、进行三维渲染、让激光图案随音乐起舞,以及使用机器学习识别语音等。除本身具有的趣味性外,这些项目还提供了很大的扩展空间,为读者探索自己的创意提供跳板。
本书为谁而写
本书是为想通过编程来理解和探索创意的人编写的,阅读本书需要了解基本的Python语法和编程概念,并熟悉高中数学。在每个项目中,我将竭尽全力诠释所需的数学知识。
本书并非Python入门教程,不介绍基础知识,而是通过一系列重要项目演示如何使用Python解决各种实际问题。在完成这些项目的过程中,你将探索Python编程语言的玄妙之处,并学习如何使用一些深受欢迎的Python库。更重要的是,你将学习如何将问题化整为零、设计出解决问题的算法并使用Python从零开始实现解决方案。
一些实际问题解决起来可能很难,因为它们通常是开放性的,要求你具备众多领域的专业知识,但Python提供了帮助你解决问题的工具。在成为专家级程序员的路途中,克服困难、找到实际问题的解决方案是最重要的。
本书涵盖的内容
下面快速浏览一下本书的内容。
第一部分包含几个帮助你热身的项目。
第1章“科赫雪花”,介绍使用递归函数和海龟绘图法绘制有趣的分形图案。
第2章“繁花曲线”,介绍使用参数方程和海龟绘图法绘制类似于万花尺生成的曲线。
第二部分包含多个使用数学模型模拟真实现象的项目。
第3章“康威生命游戏”,介绍使用NumPy和Matplotlib实现著名的“元胞自动机”模型,根据几个简单规则生成不断进化的模拟生命系统。
第4章“使用Karplus-Strong算法生成泛音”,介绍如何模拟弹拨乐器的声音,并使用PyAudio播放这些声音。
第5章“群体行为模拟”,介绍使用NumPy和Matplotlib实现Boids算法,并模拟鸟群的行为。
第三部分的项目介绍如何使用Python读取和操作二维图像。
第6章“文本图形”,介绍Python图像库(Python Imaging Library,PIL)的模块Pillow,演示如何将图像转换为文本图形。
第7章“照片马赛克”,介绍将一组较小的图像拼接在一起,创建较大的可识别图像。
第8章“裸眼立体画”,介绍利用深度贴图和像素操作赋予二维图像立体效果。
第四部分介绍如何使用着色器和OpenGL库,基于图形处理单元(Graphics Processing Unit,GPU)快速而高效地渲染三维图形。
第9章“理解OpenGL”,介绍有关如何使用OpenGL创建简单三维图形的基础知识。
第10章“圆环面上的康威生命游戏”,介绍如何在三维环面上实现模拟生命系统。
第11章“体渲染”,介绍用于渲染体数据的体光线投射算法—— 一种常用于医学成像领域(如MRI和CT)的技术。
最后,第五部分利用树莓派和其他电子元件来介绍如何在嵌入式系统中使用Python进行编程。
第12章“在树莓派Pico上实现Karplus-Strong算法”,介绍如何组装可演奏的电子乐器,并使用MicroPython在微控制器树莓派Pico上实现Karplus-Strong算法。
第13章“树莓派激光音乐秀”,介绍如何在树莓派中使用Python控制两个旋转镜片和一束激光,从而生成随音乐起舞的激光秀。
第14章“物联网花园”,介绍使用低功耗蓝牙将树莓派与运行CircuitPython的Adafruit硬件连接起来,搭建一个对花园温度和湿度进行监控的物联网系统。
第15章“树莓派音频机器学习”,介绍如何在树莓派中实现语音识别系统,带你进入激动人心的TensorFlow机器学习领域。
每章都有“实验”一节,提供如何扩展该章项目或进一步探索相关主题的建议。
本版新增内容
本版包含5个新项目,其中包括第1章“科赫雪花”和第10章“圆环面上的康威生命游戏”。此外,最重要的修订在硬件部分,本版专注于基于树莓派的系统,不再涉及Arduino。因此,第五部分的每个项目要么是全新的(第12章、第14章和第15章),要么做了全面修订(第13章)。通过使用树莓派,本书简化了硬件项目的组装过程,确保专注于Python编程,而不再需要在Python和Arduino编程语言(一种C++版本)之间切换。通过阅读修订后的第五部分,读者还将体验MicroPython和CircuitPython编程——两个针对资源有限的嵌入式系统做了优化的Python版本。
本版的其他重要修订如下。
❏ 第4章播放WAV文件时,使用PyAudio替代Pygame。
❏ 第7章为照片马赛克查找最佳图像匹配时,对线性查找算法和k-d树数据结构的性能做了比较。
❏ 第8章新增介绍如何创建用于生成裸眼立体画的自定义深度贴图。
❏ 附录A新增介绍如何使用Anaconda简化Python安装。
除这些具体修订外,还对全书进行了审校和修正,并基于第1版出版后Python发生的变化对代码做了必要的修订。
为何使用Python
Python是一种非常适合用来探索编程的语言。作为一种多范式语言,它在程序编写方式方面具有很大的灵活性。可将Python作为脚本语言用于执行代码,可将其作为过程型语言用于将程序组织成一组相互调用的函数,还可将其作为面向对象语言,从而使用类、继承和模块来打造层次结构。这种灵活性让用户能够根据项目的需求选择最合适的编程风格。
使用C或C++等更传统的语言进行开发时,必须在运行前编译并链接代码,但使用Python时,编写好代码后就可直接运行(在幕后,Python将代码编译为中间字节码,再由Python解释器运行,但这些过程对用户来说是透明的)。在使用Python进行实践时,反复修改并运行代码的过程非常简便。
Python提供了为数不多的几个简单而强大的数据结构,因此只要熟悉字符串、列表、元组、字典、列表推导式及基本控制结构(如for和while循环),便在学习Python的道路上迈出了巨大的一步。Python语法简洁而富有表现力,只需编写几行代码就能执行复杂的操作。熟悉Python内置模块和第三方模块后,便掌握了一整套解决实际问题(如本书中介绍的项目)的工具。可采用标准方式在Python中调用C/C++代码(或者反过来),并且无论要实现什么功能,几乎都能找到相应的Python库,这让用户能够在较大的项目中轻松地将Python和其他语言模块结合起来使用。正因为如此,Python被认为是一种绝佳的“胶水语言”,让用户能够轻松地将各种软件组件组合在一起。第四部分的三维图形项目表明,可将Python同类似C语言的OpenGL着色语言结合起来使用。此外,第 14 章将 HTML(超文本标记语言)、CSS(串联样式表)和JavaScript结合起来使用,为物联网花园监控器创建Web界面。在开发实际软件项目时,通常需要结合使用多种软件技术,Python非常适合用于开发这样的分层架构。
Python还提供了一个方便的工具——Python解释器,让用户能够轻松地检查代码语法、执行快速计算,乃至对正在开发的代码进行测试。编写Python代码时,我会同时打开3个窗口:文本编辑器、Shell和Python解释器。在编辑器中开发代码时,我将函数或类导入解释器,并在开发的同时进行测试。
在代码中使用新模块前,我还会先使用解释器来熟悉它们。例如,开发第14章的物联网花园项目时,我要测试数据库模块sqlite3。为此,我打开Python解释器并尝试执行如下代码,确保自己知道如何创建和添加数据库记录。
>>> import sqlite3 >>> con = sqlite3.connect('test.db') >>> cur = con.cursor() >>> cur.execute("CREATE TABLE sensor_data (TS datetime, ID text, VAL numeric)") >>> for i in range(10): ... cur.execute("INSERT into sensor_data VALUES (datetime('now'),'ABC', ?)", (i, )) >>> con.commit() >>> con.close() >>> exit()
为确认上述做法可行,我执行如下代码,以检索前面添加的部分数据:
>>> con = sqlite3.connect('test.db') >>> cur = con.cursor() >>> cur.execute("SELECT * FROM sensor_data WHERE VAL > 5") >>> print(cur.fetchall()) [('2021- 10- 16 13:01:22', 'ABC', 6), ('2021- 10- 16 13:01:22', 'ABC', 7), ('2021- 10- 16 13:01:22', 'ABC', 8), ('2021- 10- 16 13:01:22', 'ABC', 9)]
这个示例说明了Python解释器这个强大工具在开发中的实际用途:要快速进行实验,无须编写完整的程序,打开解释器就可开始。这只是我喜爱Python(同时认为你也会喜爱它)的众多原因之一。
示例代码
对于本书中每个项目的代码,我都竭尽所能、力图条分缕析地做出详尽的剖析。你可手动输入代码,也可按“资源与支持”页所述方式获取本书所有程序的完整代码。
接下来,我将带领你完成众多令人兴奋的项目,但愿你玩得和我开发时一样开心。别忘了探索每个项目中的实验。祝你在阅读本书的过程中拥有愉快的编程时光!