后记
🤖 作者:包瑞清(richie bao): lastmod: 2025-02-18T00:05:39+08:00
从 2024 年 7 月开始书写,到 2025 年 2 月末完成初稿。写作过程中,一直思索如何写作更适用于: 1. 没有学习过任何一门语言的初学者,希望先从一门开始学习;2. 已学习过一门编程语言,但希望开始学习其它一门或多门的学习者;3. 不仅适用于想学习任何一门语言的初学者,也能够将该书作为实用的工具书,方便多门编程语言基础知识的比较查询;4. 能够学以致用,不仅提升对编程语言本身知识的掌握,也能够学习到新的技能。
在高校里讲授 Python 编程语言基础和 C 语言编程及参数化设计编程等课程,尝试过多种不同的讲授内容和方式,逐渐更清晰地认识到什么内容和怎样地学习方式更适合于初学者。还清晰地记得第一次讲授 Python 编程语言时地情景,课程安排不仅节奏快,3~4次课,约6~8小时,就把 Python 基础全部过完;而且内容难度陡坡式增长,不仅包括基础知识,还更多涉及到数据库、智能体、机器学习和深度学习等。这样地讲授完全不适合初学者,不能够因为作者15年多不断在写代码积累内化之后,就将认为编程语言学习起来不难地想法放到初学者身上。后来不断的修改课程内容,虽然讲授的节奏开始张弛有度,内容也符合入门学习的同学,但细节处的思索似乎深度不够,主要包括两点,第一点是示例应该更简单,从而把注意力应该放在语言本身,例如,
# 这组数据来自城市环境传感器(AoT, array of things),提取了部分数据,包括字段有:地址(string)、ID编号(string)、经纬度(float)共4类值,以单独列表形式存储。
coordi_lon = [-87.628, -87.616, -87.631, -87.59, -87.711, -87.628, -87.586, -87.713, -87.676, -87.624]
coordi_lat = [41.878, 41.858, 41.926, 41.81, 41.866, 41.883, 41.781, 41.751, 41.852, 41.736]
node_id = ['ba46', 'ba3b', 'f02f', 'ba8f', 'ba16', '7e5d', 'ba8b', 'ba13', 'ba18', 'bc10']
address = ['State St & Jackson Blvd Chicago IL', '18th St & Lake Shore Dr Chicago IL', 'Lake Shore Drive & Fullerton Ave Chicago IL', 'Cornell & 47th St Chicago IL', 'Homan Ave & Roosevelt Rd Chicago IL', 'State St & Washington St Chicago IL', 'Stony Island Ave & 63rd St Chicago IL', '7801 S Lawndale Ave Chicago IL', 'Damen Ave & Cermak Chicago IL', 'State St & 87th Chicago IL']
# 提取索引值为2对应的数值
idx_AoT = 2
idx_lon = coordi_lon[idx_AoT]
idx_lat = coordi_lat[idx_AoT]
idx_nodeID = node_id[idx_AoT]
idx_address = address[idx_AoT]
print('values with the index 2: \
\nid={0};\nlon={2};\nlat={3};\naddress={1}'.format(idx_nodeID,idx_address,idx_lon,idx_lat))
还是,
fruits = [
"apple",
"banana",
"orange",
"Cherry",
"Peach",
] # 建立仅包含字符串(元素)的列表
# 访问列表元素——使用索引值,列表索引值从 0 开始;为正数从前向后计数;为负数时,从后向前计数
print(f"fruits[0]={fruits[0]}\nfruits[3]={fruits[3]}\nfruits[-2]={fruits[-2]}")
第一个示例把重点放在了数据的实际意义上,但也增加了阅读的难度。而第二个示例,用最简单的编造数据,将重点放在语言本身上,能够快速查看到语法结构,提升学习效率和专注度。
第二点是进一步强化知识的结构性和连续性。我们会非常容易地接受先捋清楚整体结构,再向各个分支填细节地思考过程。因此章节地安排老老实实地按照编程语言地结构进行,这包括 解释器/编译器和Hello 代码 -> 数据类型 -> 变量赋值 -> 字符串格式化 -> 基础运算 -> 数据结构 -> 控制结构 -> 函数方法 -> 面向对象 -> [结构体和联合体] -> [指针]等基础内容。当了解到编程语言基础核心知识结构和顺序关系后,学习时会不时地抓起这根可以将知识串起来地线索,即不时从宏观视角查看当前学习的点所在线索中的位置及关联,会一定程度上降低学习的难度。
如果只学习一门语言,不会涉及到学习多门语言时的混淆问题。那么学习多门语言,尤其同时学习多门时,如何有效的避免“混乱”并高效掌握?1是,学习和牢靠掌握上述提到的语言基本结构,了解底层原理,掌握核心编程概念,减少不同语言表现形式(表象)存在差异,从而提高迁移能力。2是,归纳和对比学习法,这也是本书所采取的叙述结构,如表,
特性 | Python | C | C++ | C# |
---|---|---|---|---|
变量声明 | x = 10 |
int x = 10; |
int x = 10; |
int x = 10; |
函数定义 | def foo(): |
void foo() {} |
void foo() {} |
void Foo() {} |
控制结构 | if x > 5: print(x) |
if (x > 5) {} printf("%d", x); |
if (x > 5) {} cout << x; |
if (x > 5) {} Console.WriteLine(x); |
循环 | for i in range(10): |
for (int i = 0; i < 10; i++) {} |
for (int i = 0; i < 10; i++) {} |
for (int i = 0; i < 10; i++) {} |
类 | class A: pass |
struct A {} |
class A {} |
class A {} |
继承 | class B(A): |
struct B : public A |
class B : public A {} |
class B : A {} |
构造函数 | def __init__(self): |
A() {} |
A() {} |
public A() {} |
字符串操作 | s = "Hello" s.upper() |
char s[] = "Hello"; |
std::string s = "Hello"; |
string s = "Hello"; |
数组 | arr = [1, 2, 3] |
int arr[3] = {1, 2, 3}; |
int arr[3] = {1, 2, 3}; |
int[] arr = {1, 2, 3}; |
指针 | 不支持指针 | int *p = &x; |
int *p = &x; |
不支持显式指针 |
内存管理 | 自动垃圾回收 | 手动管理(malloc() ,free() ) |
手动管理(new ,delete ) |
自动垃圾回收(.NET GC) |
异常处理 | try: ... except: |
if (error) {} |
try { ... } catch(...) |
try { ... } catch {} |
通过建立不同语言同一结构的不同表现形式对比表格,方便快速对比学习,从而帮助同时掌握不同编程语言并减小混淆。也可以帮助已掌握一门语言,但需要学习另外语言的学习者,能够迁移已掌握语言的知识到新的语言类型上,从而更快速的学习新的语言,同时避免混淆。
虽然各个编程语言具有类似的语言结构和语法,但各自主要应用的领域会存在差异,如表,
应用领域 | Python | C | C++ | C# |
---|---|---|---|---|
操作系统开发 | ❌ | ✅ | ✅ | ❌ |
嵌入式系统 | ⚠️(MicroPython) | ✅ | ✅ | ❌ |
驱动程序 | ❌ | ✅ | ✅ | ❌ |
游戏开发 | ⚠️(Pygame) | ❌ | ✅(Unreal Engine) | ✅(Unity) |
Web 开发 | ✅(Django、Flask) | ❌ | ❌ | ✅(ASP.NET) |
桌面应用开发 | ✅(PySide6、PyQt、Tkinter) | ❌ | ✅(WinUI、Qt、WxWidgets) | ✅(WinUI、WinForms、WPF) |
数据库开发 | ✅(SQLAlchemy) | ✅(MySQL 内核) | ✅(MongoDB 内核) | ✅(Entity Framework) |
数据分析与科学计算 | ✅(NumPy、Pandas) | ❌ | ⚠️(有限支持) | ❌ |
人工智能 / 机器学习 | ✅(TensorFlow、PyTorch) | ❌ | ✅(TensorRT、C++ API) | ❌ |
计算机视觉 | ✅(OpenCV) | ❌ | ✅(OpenCV C++ API) | ❌ |
网络爬虫 | ✅(Scrapy、BeautifulSoup) | ❌ | ❌ | ❌ |
自动化与脚本 | ✅(Selenium、PyAutoGUI) | ⚠️(Shell 替代) | ❌ | ❌ |
企业级应用 | ⚠️(小规模) | ❌ | ✅(高性能应用) | ✅(.NET 生态) |
云计算与服务器 | ✅(FastAPI、Flask) | ❌ | ✅(高并发服务器) | ✅(Azure、ASP.NET) |
网络安全 / 逆向 | ✅(Scapy、pwntools) | ✅(黑客工具) | ✅(逆向工程) | ❌ |
高性能计算(HPC) | ⚠️(依赖 C/C++ 库) | ✅ | ✅ | ❌ |
金融 / 高频交易 | ✅(QuantLib、Pandas) | ❌ | ✅(低延迟 C++ 交易系统) | ❌ |
图形渲染 / 多媒体 | ⚠️(Matplotlib) | ❌ | ✅(OpenGL、Vulkan) | ❌ |
物联网(IoT) | ⚠️(MicroPython) | ✅ | ✅ | ❌ |
✅:该语言在该领域应用广泛;⚠️:可用,但不是主要选择;❌:不常用于该领域。
阅读本书的读者会来自于不同的行业领域,而当学习完基础知识之后,需要具体结合到实际应用来练习学习到的编程语言知识,以学以致用。如果是非计算机专业不同领域的研究者,常用 Python 编程语言进行数据分析和科学计算,乃至应用机器/深度学习的算法;也有预从事物联网/嵌入式系统开发的读者;从事游戏开发的读者;从事应用程序软件开发的读者;从事数据库开发的读者;或者不同领域使用所用专业软件工具的语言脚本等。那么,在本身书写到应用部分,对于多门编程语言学习的应用示例就不那么容易确定方向。最后选择桌面应用开发的目的是,应用自身就是一个工具,不同领域的读者均可结合自身专业来开发对应的专业软件,将专业知识融入到软件应用中,这与作者认为的“成为工具的构建者”的理念一致。
对于 C 语言则结合到嵌入式系统 Arduino 开源硬件和 IoT 的开发上,不过这部分仅简要阐述,起引导作用。如果扩展开来写,应该是另一本或多本专业著作。在高校讲授 C 编程语言的时候,就是结合 Arduino 开源硬件,而不建议纯粹讲语言本身,这是因为 C 语言是接近硬件的一种语言,通过学习嵌入式系统,能够学会如何直接访问硬件资源,理解操作系统的工作原理,如操作 CPU 寄存器、内存映射、位操作等低级编程,而这些在其它编程领域,如应用开发等中通常是抽象掉的。
小的时候还没有普及计算机,没有网络,如果想学习一门知识(相信很多读者小时都对电子机械感兴趣),很难去寻找资源。而现在,网络资源丰富,从电子书到网课,各种信息可随时查询,更何况 AI (ChatGPT、DeepSeek 等)的出现。想学什么就可以找到相应的资源,并进行比较,找到自己适合的材料和学习的方式。物流的发展,也让我们可以从全国,甚至全球购置所需的学习材料,如嵌入式系统的开发板,电子元器件等。这个时代为每个学习者提供了尽可能多的便利和学习资源获取的公平,有时会想这个时代或者未来是否还需要大学,乃至高中?单纯就知识的学习和技能的获取上来说,如果社会对人才的考核方式不再是考试、考级这样单一的筛选制度,那么数字智能时代的今天或未来,有很多事情都会方式改变。
○●↣⤷#//;:=()$✸{}"’*!?<>~•⚠️❌✅🤖