说起来也有趣,谁能想到我身为一个文科生,最后却走上了 Coder 的道路。
中学时候,我对物理就抱有深深的恐惧,它一度让我在高二年级分班的时候毅然决然地选择了文科;高考后录取的学校也是文科院校,似乎跟代码八竿子打不到一块。
所上的课程中,唯一与代码有关的就是一门和统计课程相配套的 STATA 软件应用课程。
但是,当时的我并没有发现自己是个热爱敲代码的人。在暑假某个无聊的日子,我拿起了这门课上用到的教材,开始学习操作了起来。一段时间后发现,其实老师课上讲的许多东西并不难,编码更是容易的实现分析需要的手段。从那时起,我就对编程开始有了兴趣。
说是编程,更多其实是为了数据分析而学编程。但学校并没有开设有关数据分析的课程,所以我只能自学。不过我学习的第一门语言不是 Python,是 R 语言。
在数据分析领域,R 语言其实一直是被人们拿来和 Python 比较但却是难分伯仲。R 语言好的地方在于存在大量的第三方包可供使用者调用,这是 R 一直富有生命力的地方。R 语言在我大一到大二期间(2015 年至 2016 年)的时候仍然是数据分析热门的选择之一,而 Python 这时只是处于上升趋势。
那时恰逢学校有老师新开了一门 R 语言的公选课,于是我果断在选课时选了这门课程,并在这门 R 语言公选课上拿到了满分。这给了我继续 Coding 的动力。但是这样的热情随着考研的来临逐渐褪去,我不得不将更多心思放在考研准备中,虽然当中我也继续有写过一些用 R 语言做数据分析的文章,可都还只是停留在基础的数据分析层面,而没有深入到更多技术细节或更高级的领域中。
然而考研并没有成功,从考研成绩出来到写毕业论文之前的一段时间里一直都在宿舍里「赋闲」。
这时我重新拾起了一个学习的念头,我希望即使我出去工作,也能找有关数据分析的工作。那时候 Python 已经是机器学习、深度学习火热的首选语言之一,各类有关 Python 的教程如雨后春笋般窜出。但是我就仅仅是根据网上的一些资料来重新自学,可自学的道路异常艰苦,没有人给你准备好完整、可靠、体系的资料,没有人给你设置好翔实、细致入微地讲解课程,一切都靠自己去摸爬滚打。
我想过学过 R 语言的我或许入门会很快,但是其实也是有点困难;因为 R 语言的语法和 Python 的语法有点差异,而且 Python 似乎太过于简洁,以至于很多东西我不知道从哪调用。那时候我看到了 Pandas 库(Python 数据分析领域的核心库)作者所写的一本《利用 Python 进行数据分析》,跟着学了之后尽管仍有些懵懵懂懂,可在接下来的一个月的时间里,我喜欢上了这门简单、直观地编程语言,我上手也越来越快了。
Why Python?
也许会有人问,「为什么选择 Python?」。
在没接触过编程之前,可能我们对于编程地刻板印象就是在编写大片由字母和符号堆砌成的代码,或是一堆看不懂的 01 数字;但是接触 Python 之后就会发现似乎编程语言也没有那么困难。
所以为什么选择 Python,我的答案是:因为它很简单。
我所说的简单,当然是仅仅停留在它易用易上手的层面;实际上关于 Python 的各种技术细节可不是那么简单。
但是光是上手简单就已经可以让 Python 成为目前入门编程最好的语言之一了(还有一门我认为是 SQL)。它不需要你指定变量的类型、不需要写过多地代码、不需要你遵循太多复杂的规则。正如《Python 之禅》里开头三句写道:
优美胜于丑陋
明了胜于晦涩
简洁胜于复杂
当然,Python 也并非没有缺点,它在大型的一些开发上会性能有瓶颈、在某些方面速度会慢于其他编程语言等。但是无论别人怎么评价这门语言,谁都不能否认它是用来培养编程兴趣或习惯成本最低的程序语言之一。Python 生态社区如今快速发展与壮大,也离不开它语法本身简单直观。
关于教程内容
在我眼里,一份好的基础入门教程应该要兼顾大部分初学者的学习水平和吸收水平,而不是一味追求高级技巧或者更多的技术细节。
这就好比我们在中学时上的各种数理化生课程一样,老师光是一味地讲公式、理论,但是没有去实际练习、实践,最终能搞懂的知识点都仅仅只是一部分尖子生。然而衡量一个老师的教学水平难道是以多少个尖子生考得好成绩为准吗?不尽然,尖子生就那么几个提升不可能较大的幅度,但是除去尖子生之外的学生群体,老师所讲的知识能让这部分群体的学生听懂才是老师教学水平高低的体现。
既然我是一个文科生,我就会从文科生的角度尽量将那些枯燥乏味的入门内容讲得形象一些,为的是让学习本次教程的朋友能够理解并留有深刻印象;同时,在课程内容设置上,出了一些必要的 Python 基础知识外,我还会在相应的章节中延伸一部分进阶的内容,如正则表达式、生成器、列表解析式、装饰器等。
我希望这门教程不仅仅只是一门很基础的课程,同时也带有一丝丝「通识」的性质。虽然不奢求大家一定能搞懂这些延伸的内容,但是能够让大家有所了解、知道还有这样的领域或用法,那就达到我所预期的目的了。
除此之外,我在除了第一章和第八章之外的每一章节的最后部分还为大家编写了一些实践案例,你可以在学完之后尝试去重复我的做法或是沿用我的思路用另外一种做法去动手实践案例,相信你对本次教程所讲的内容能够有更好的理解。我在结尾处还为大家推荐了一些内容优质、难度适中的学习参考资料供大家阅读,当中大部分是免费、开源的,可以不用花费额外的费用。
结尾
种树的最好时间是十年前,其次是现在。
无论是学习编程也好,还是学习写作也好;学习的最佳时机一个是十年前,其次是当下,「On The Way」才能让自己保持进步的态度。现在的我仍然还是会学习各种应用领域中的技术,因为在实际工作中的需求只会越来越高,原地踏步迟早会让自己被后来居上者给淘汰。
师傅领进门,修行靠个人
写这份教程的初衷并不是说单单只是作为副业这么简单,我希望能给那些像我一样的文科生或者新手有一份可供快速学习、上手的参考资料,而不再为七零八落、质量良莠不齐的教程白花时间和精力。
尽管现在有关于 Python 的教程越来越多,在少数派的 Matrix 作者群里大家有时候也会吐槽一两句「现在到处都是学 Python 的广告」,但是作为一个目前从业并使用这门语言的人,我想谈一谈我的观点。
对于「想了解或对编程感兴趣的人」来说,Python 可以说得上是足够友好了。这里的友好不单单是语法上的友好,还包括技术社区的友好、使用范围上的友好。一方面,语法的简单让人在学习时不需要去记太多关键字、规范,减少了学习的难度;另一方面,因为Python作为一门「脚本语言」有着广泛的应用,所以每当存在一些需要解决问题时,总能有人告诉你可尝试的、正确的解决办法,有效减轻所产生问题带给你身心上的阵痛。
但对于那些「想要找一份与编程有关工作的人」来说,即便会 Python,它也不足以成为让你能够得到 Offer 的专业技能。我们可以随便在一个招聘网站上搜索有关于 Python 开发的岗位信息,你会发现没有哪个岗位是单单只要求你会 Python。除了 Python 以外,你可能还需要会 MySQL(主流的关系型数据库)、Linux 操作、Git(团队代码协作)、Java、Spark 等等⋯⋯你需要学习的可能远不止这些。
无论我们是出于怎样的目的学习编程,我们首先应该要保持的是自己的兴趣,因为兴趣才是推动人进步的首要因素;在兴趣之上,借助编程能让你的思维可以走得没准会更远。
我希望这门教程能给你学习的启发,我所做的仅仅也只是「引路人」的角色。
真正的提高还需要靠自己将本次教程中所讲的内容和生活、工作相联系起来去运用。
祝编程愉快!
100gle
2019.11.15 于上海