Chapter 1 战前动员

2020-10-16
6 min read

战前动员

在高中的时候,我的好朋友东杰送我了一本清华大学谭浩强的《C程序设计》,也正是在那一刻,我开启了对编程浓浓的兴趣。也是在高中,我第一次接触到了吉他和单反相机。东杰后来去了南京创业,做的就是程序开发方面的工作;而我进入了天津大学电气工程专业,却也与编程结下了不解之缘。

我们专业对编程的要求很高,因为许多计算方法都非人力能够完成,必须借助计算机才能实现,例如最著名的潮流方程,涉及到迭代和矩阵求逆,非常复杂。记得当时我用的是MATLAB(m语言)编写潮流计算程序,这种语言是一种相当高级的语言,代码量一般不会很大,但即使这样,我的潮流计算也多达几百行代码,这样才能实现从数据读取、预处理、潮流计算、输出的全部功能。最后,这段程序非常神奇地,把一个庞大且复杂的计算,只花了0.2秒就从读取数据运行到了输出。

实际上,我们课程教的是C++,这是一种比C语言更高级一些的“面向对象”语言(关于面向对象,有机会再做解释),考前为了检验自己的复习成果,用C++写了一个dos版的贪吃蛇,最后考试也得了97分;后来学习微机原理,我又掌握了8086汇编语言,这是一种比C语言还要底层的语言,它可以直接对寄存器和内存进行操作,在课程设计部分,我用汇编语言写了一个扫码枪的程序,能够通过读取扫码枪的条码在LCD屏幕上显示商品信息;大四的时候,为了做大创项目,又学习了Java,基于一个开源的交通流软件Matsim,编写了支持电动汽车特性的包,并翻译了英文著作发表中文帖子,后来被上海的一家交通创业公司联系合作。算下来,在大学期间陆陆续续至少掌握了5种编程语言:C、C++、汇编、Java、m(MATLAB)。

那么,为什么我又学习Python了呢?其实主要还是一种偶然。记得那是2017年,Python还没有现在这么火,当时的我对编程有着一种近乎入迷的向往,并且对C++的复杂配置、闭源环境深恶痛疾,于是下决心寻找一门简单、优雅的编程语言,作为我以后主要编程的工具。其实当时可选的编程语言有很多,Python只是其中一种,据我所知,Java在大项目中的受欢迎程度远超过Python,C#也非常不错,另外还有Ruby、Go等等各种优秀的编程语言。而使得Python一下子戳中我,令我迫不及待想要了解它的原因,就在于下面这首《Python之禅》。只要在Python的命令行环境中输入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之禅:Tim Peters

美丽优于丑陋。
清楚优于含糊。
简单优于复杂。
复杂优于繁琐。
平坦优于曲折。
宽松优于密集。
重要的是可读性。
特殊的案例不足以特殊到破坏规则。
尽管实践可以打破真理。
错误却不可置之不理。
除非另有明确要求。
面对模棱两可,拒绝猜测。
总会有一个 —— 最好是只有一个 —— 显而易见的方式来明辨。
哪怕这种方式在开始的时候可能并不明显 —— 除非你是荷兰人。
现在有比没有好。
尽管没有经常好于现在。
如果如何实现很难被解释清楚,那么这个想法就是一个坏想法。
如果如何实现可以被很好的解释,那么这是一个好想法。
命名空间就是一个非常好的想法 —— 让我们在这方面多做些工作吧!

读完后我感到热血沸腾,没有什么比这句话更能令我了解Python语言的设计艺术了。我想,这就是程序员彼此之间心照不宣的浪漫吧。如果大家编写代码时都按照《Python之禅》所提倡的准则,那么世界将会变得更加美好。在读完之后,我不假思索地想要开始了解Python这门语言,发现它为了简洁性、优美性,甚至不遗余力地提供一些看似难以理解的功能和命名方法——这也是未来学习Python将会遇到的“坎”(这里埋下一个小伏笔),但这也同样是成就Python作为最伟大的编程语言的重要因素之一。不过,空有这些花花架子可不行,令Python语言如此流行的根本因素,在于庞大的使用者数量,以及开发者们提供的数以万计的扩展包(package)——这两部分体现了一个编程语言的生命力。在这些扩展包的基础上,我可以很方便地通过requests和urllib制作网络爬虫实现网页自动化抓取、可以利用numpy和matplotlib代替MATLAB实现数据处理和绘图、可以基于pandas代替excel进行数据自动化分析,并利用plotly将结果以优美的绘图呈现出来、可以利用pyqt或wxpython自己做一个用户界面、可以用pytorch进行机器学习、甚至可以用pygame做一个小游戏玩,并且最重要的,这些全都是开源免费的,并且获取极其容易,只需要一个pip install命令,就能够让电脑中的python环境拥有这些强大的功能!这点深刻地体现了一句程序员都喜闻乐见的话:不要重复造轮子。对于程序员而言,最重要的并不是了解各种复杂的数据结构、优化计算机内存这些繁琐的底层的工作——把它们留给编译器或专业人士吧!因为他们一定做的比我更好,而我只需要在这些已经非常成熟的代码的基础上,开发自己的代码。换句话说,我们不可能人人通过修炼变成巨人,但我们人人都可以站在巨人的肩膀上,去触摸天空。明白了这些,就明白了开源的魅力,也明白了为何Python可以保持如此强大的生命力。

总结来说,Python至少拥有以下优点:

  1. 代码优美简洁:有句玩笑话,即使你完全不懂Python,看了源代码也大概能猜到意思。
  2. 交互式编程:Python是解释性语言,可以写一句得到一句的结果,这样非常方便测试程序;而不需要像C或者Java那种编译型语言,必须写完一段完整的语句,才能运行得到输出。
  3. 拥有一切高级语言所该具有的功能:面向对象、异常处理、多线程都不在话下。除此之外,还提供许多特色功能,例如切片、map&reduce、迭代生成器、装饰器等,这些功能让你的代码如虎添翼。
  4. 异常庞大的社区和用户贡献:想要实现任何一件编程任务,也许有百分之80%以上的代码可以直接拿来使用。举个例子,如果我想定期抓举某个网页,分析网页内容,并把结果输出到一个word文档中,那么我可以基于requests制作网络爬虫,利用beautifulsoap解析html,利用pandas等包分析网页数据,最后利用python-docx把结果保存到word文档中——这些包都可以通过一条简单的命令pip install 安装——而需要我去做的,就是思考如通过这些包里的函数实现个性化需求,然后当每次遇到这个任务,运行一下这个程序。
  5. 教程资源丰富:网上有大量的Python教程,学Python时遇到的问题也能在许多论坛中找到。最最最重要的:如果你想知道某个函数的功能和用法是什么,只需要在Python命令行输入help XXX,就能得到帮助文档!这一点对于编程实在是太实用了。

看到这里,你是不是已经心动、、想要跃跃欲试了?尽管我会这么多种编程语言,但最后只有Python成为了我的心头肉。相信你也会越来越喜欢上Python:一门接近人类语言的高级编程语言。