很多人都说用 Python 编程十分简单,即便是 6 岁的小孩也可轻松学会。我自己最开始使用 Python 编程时也这样认为。那时我作为全职软件开发人员已有 4 年时间,主要在 Linux 平台上基于 QT 库进行 C++ 编程。但是,我最初使用 Python 时编写了很多糟糕的代码。
如今,我已经从 C++ 转到 Python 三年了,我觉得自己有必要总结一下这段时间取得的进展。回顾这段经历,不仅是我的主要编程语言发生了变化,此外,我的工作环境以及我对代码的思考方式也发生了变化。
在本文中,我将主要分享自己的经验,而不会详细描述 C++ 和 Python 之间的细节和差异,因为网上已经有了许多它们的对比文章。我希望这篇文章对于像我一样有着类似经历的人有所帮助。
C++ 像深潜,Python 像浮潜
使用 C++ 就像深浅一样,你可以潜入大海深处探索其神奇的奥秘和美丽,但这需要大量的学习和练习,但总的来说,你所覆盖的面积不会太大。
而Python 则更像浮潜,你只需把头伸进水里,就可以看到美丽的景色,但你无法继续深入。你只能继续在浅水区游动,可以轻而易举地游很远,覆盖很大的海面。从这个描述可以清楚地看出,每种语言都应该在正确的地点和时间使用。
深入 C++
C++ 非常严格,它会对你的错误进行严厉的惩罚。在你的编码过程中,几乎很难避免段错误。因此,使用 C++ 编程需要开发者深入了解计算机、编译器和编程语言。随着学习过程的深入,你可以看到很多美好的东西,比如编译过程和内存管理。
作为一名 C++ 程序员,我需要密切关注各种语法。我需要对内存的分配和释放了如指掌。程序的依赖性更少,因为我喜欢对自己所写代码内部发生的事情有所了解。如果使用太多其他人的库,可能会不太可靠,出错之后很麻烦,并且可能会破坏你的内存使用量。
我习惯使用 Vim 来编程,此外会搭配很多插件,比如用于调试的 GDB 和用于分析程序内存使用情况和错误的 Valgrind。我自己编写 Makefile 然后用 g++ 编译代码。
那时的自己并不觉得 IDE 益处很大,我宁可放慢速度也不会让自己失去对代码的掌控。现在回想起来,我确实非常依赖编译器来查找类型错误。
在 Python 中浅泳
从 C++ 切换到 Python 时,你需要学习的第一件事就是要学会放手:在 Python 中你很难知道程序的内部机制,不知道内存如何被分配和释放。你还会经常使用其他人编写的代码,这些代码将打包到库中,因为它们可以节省你的时间并帮助你更快地编写代码。这并不意味着你需要编写速度慢且依赖于未维护和非功能库的代码,但重点肯定是不同的。
当我开始用 Python 编写代码时,我首先按照 C++ 的思路来编程 Python 代码。这当然可行,但我并没有发挥出 Python 的优势。当我开始以更 “Pythonic” 的方式编程并开始使用库以及更高级的概念(比如生成器、装饰器和上下文)时,我的 Python 编程技能才得到显著的提升。
作为一名 Python 开发人员,我遇到问题时首先会看看有没有现成的库可以解决该问题。Python 拥有丰富的库生态系统及其社区。这些丰富和庞大的库几乎涵盖了所有领域。我经常使用的库有:用于数值计算的 NumPy、计算机视觉库 OpenCV、用来读取 JSON 文件的 JSON、用于科学计算的 SciPy以及 SQLite3 数据库。
我最常使用的 IDE 是带有 IdeaVim 插件的 PyCharm。这是一款功能非常强大的调试器,它比默认的 Python 调试器 pdb 更好用。我使用 pip 来安装我所需要的库。除非我真的需要,否则我不再监视我程序的内存使用情况。
一些实用的技巧
如果你是一名 C++ 开发人员,并且考虑开始使用 Python 编程,以下是我的一下小建议:
改掉旧习惯
不要把 C++ 编译器当调试器用。不要过度优化内存使用情况。避免编写类似 C++ 风格的代码。无论如何,尽量不要依赖类型。
培养新习惯
善用 Python 库。编写 Pythonic 代码(但不要过度)。保持可读性。使用更复杂的概念,比如生成器、装饰器、上下文。试试 PyCharm。
使用 C++ 和 Python 公共库
某些 C++ 库(如 OpenCV 和 QT)具有 Python 接口。很容易在 Python 中使用相同的库,而不是从头开始学习新的库。
根据应用场景选择恰当的编程语言
有时 Python 太慢或者不适合某类任务。此时就该 C++ 出马了。在 Python 中使用 C++ 代码的方法很多,有 SIP、ctypes 等方式。
总结
不管其他人怎么说,实际上,从一种语言切换到另一种编程语言并不容易,尤其是新的语言与你习惯使用的语言区别很大时。你需要花很多时间学习、深入、探索。但最重要的是,要明白不仅语言应该改变,而且你的编码风格和工作方法也要改变。