01 | 如何逐步突破,成为Python高手?

你好,我是景霄。

工作中,我总听到很多程序员抱怨,说现在的计算机编程语言太多了,学不过来了。一些人Java用了很多年,但是最近的项目突然需要用Python,就会不知所措,压力很大。

众所周知,Facebook的主流语言是Hack(PHP的进化版本)。不过,我敢拍着胸脯说,就刚入职的工程师而言,100个里至少有95个,以前都从未用过Hack或者PHP。但是,这些人上手都特别快,基本上一两周后,日常编程便毫无压力了。

他们是怎么做到的呢?

事实上,他们遵循的,正是我在开篇词中提到的方法,也是本专栏学习的中心观点:“从工程的角度去学习Python”。那么具体来说,到底要怎么学,学习的过程中又要特别注意哪些地方呢?

不同语言,需融会贯通

其实,如果你在学一门语言的时候多阅读、多练习、多思考,你就会发现,不同语言都是类似的。编程语言本就是人类控制计算机的指令,语法规则等方面自然大同小异。

而在原有基础上,学习一门新的编程语言,其实也没有那么难,你首先要做到的是明确区分。比如,在学习Python的条件与循环语句时,多回忆一下其他语言的语法是怎样的。再如,遇到Python中的字符串相加时,你能分析出它的复杂度吗?再联想到其他语言,比如Java中字符串相加的复杂度,它们之间有什么相同点、又有什么区别呢?

除了能够明确区分语言的不同点,我们还要能联系起来灵活运用。比如,最典型的“编程语言两问”:

  • 你了解你学过的每种编程语言的特点吗?

  • 你能根据不同的产品需求,选用合适的编程语言吗?

举个例子,Python的优点之一是特别擅长数据分析,所以广泛应用于人工智能、机器学习等领域,如机器学习中TensorFlow的框架,就是用Python写的。但是涉及到底层的矩阵运算等等,还是要依赖于C++完成,因为C++的速度快,运行效率更高。

事实上,很多公司都是这样,服务器端开发基于Python,但底层的基础架构依赖于C++。这就是典型的“不同需求选用不同语言”。毕竟,你要明白,哪怕只是几十到几百毫秒的速度差距,对于公司、对于用户体验来说都是决定性的。

唯一语言,可循序渐进

当然,如果Python是你学的第一门编程语言,那也不必担心。我们知道,虽然同为人机交互的桥梁,Python语言比起C++、Java等主流语言,语法更简洁,也更接近英语,对编程世界的新人还是很友好的,这也是其显著优点。这种情况下,你要做的就是专注于Python这一门语言,明确学习的重点,把握好节奏循序渐进地学习。

根据我多年的学习工作经验,我把编程语言的学习重点,总结成了下面这三步,无论你是否有其他语言的基础,都可以对照来做,稳步进阶。

第一步:大厦之基,勤加练习

任何一门编程语言,其覆盖范围都是相当广泛的,从基本的变量赋值、条件循环,到并发编程、Web开发等等,我想市面上几乎没有任何一本书能够罗列完全。

所以,我建议你,在掌握必要的基础时,就得多上手操作了。千万不要等到把教材上所有东西都学完了才开始,因为到那时候你会发现,前面好不容易记住的一堆东西似乎又忘记了。计算机科学是一门十分讲究实战的学科,因此越早上手练习,练得越多越勤,就越好。

不过,到底什么叫做必要的基础呢?以Python为例,如果你能够理解变量间的赋值、基本的数据类型、条件与循环语句、函数的用法,那么你就达到了第一步的底线标准,应该开始在课下多多练习了。

比方说,你可以自己动手编程做一个简易的计算器,这应该也是大多数程序员实操的第一个小项目。用户输入数字和运算符后,你的程序能够检查输入是否合法并且返回正确的结果吗?

在做这个小项目的过程中,你可能会遇到不少问题。我的建议是,遇到不懂的问题时,多去Stack Overflow上查询,这样你还能阅读别人优秀的代码,借鉴别人的思路,对于你的学习肯定大有帮助。当然,实在解决不了的问题,也可以写在留言区,我们一起来解决。

第二步:代码规范,必不可少

诚然,学习编程讲究快和高效。但是,与此同时,请一定不要忽略每一种语言必要的编程规范。在你自己刚开始写代码练习时,你可以不写单元测试,但总不能几百行的代码却没有一个函数,而是从头顺序写到尾吧?你可以省略一些可有可无的注释,但总不能把很多行代码全部并到一行吧?

比如,我们来看下面这行代码:

v.A(param1, param2, param3).B(param4, param5).C(param6, param7).D()

显然,这样写十分不科学,应该把它拆分成多行:

v.A(param1, param2, param3) \ #  字符'\'表示换行
 .B(param4, param5) \
 .C(param6, param7) \
 .D()

再比如,变量和函数的命名虽有一定的随意性,但一定要有意义。如果你图省事,直接把变量依次命名为v1、v2、v3等,把函数依次命名为func1、func2、func3等等,不仅让其他人难理解,就算是你自己,日后维护起来都费劲儿。

一名优秀的程序员,一定遵守编程语言的代码规范。像Facebook的工程师,每次写完代码都必须经过别人的review才能提交。如果有不遵守代码规范的例子,哪怕只是一个函数或是一个变量的命名,我们都会要求原作者加以修改,严格规范才能保证代码库的代码质量。

第三步:开发经验,质的突破

想要真正熟练地掌握Python或者是任何一门其他的编程语言,拥有大中型产品的开发经验是必不可少的。因为实战经验才能让你站得更高,望得更远。

比如我们每天都在用搜索引擎,但你了解一个搜索引擎的服务器端实现吗?这是一个典型的面向对象设计,你需要定义一系列相关的类和函数,需要从产品需求、代码复杂度、效率以及可读性等多个方面考虑,同时,上线后还要进行各种优化等等。

当然,在专栏里我没办法让你完成一个上亿用户级的实践产品,但是我会把自己这些年的开发经验倾囊相授,并通过量化交易这个实战案例,带你踏入“高级战场”,帮你掌握必要的开发知识。

最后,我专门为你绘制了一张Python学习的知识图谱,里面涵盖了Python最高频的核心知识,大部分内容我在专栏中都会讲到。你可以保存或者打印出来,作为学习参考。

今天,我跟你分享了Python的学习方法和注意事项,其实这些观点不只适用于Python,也能帮助你学习任何一门其他计算机编程语言,希望你能牢记在心。在接下来的课程里,我会带你逐步突破,最终成为一名Python高手。

那么,对于学习Python或者是其他编程语言,你有什么困扰或是心得吗?欢迎在留言区与我交流!

精选留言

  • 夜路破晓

    2019-05-10 14:17:21

    编程零基础自学Python半年一直在门口打转转,水平局限于leetcode刷题复写代码,会看不会写,更没有信心自己上手项目,更别提找到相应的工作了。
    我有些业务经验基础和对数据的好奇心,目前希望转行先做数据分析逐渐往自动化运营方向发展,边做边学,打算报考在职研究生系统地学习下计算机科学,主要方向是机器学习和人工智能。
    我的问题是,现在年龄也不小了,半路出家“工程师”不知道能不能成?但明知道悬崖在前,不得不自我鞭策,每天工作、生活与学习交织并行,感到鸭梨山大,焦虑感与日俱增。
    我对学习不迷茫,因为我发自内心信任地学习,但我对转行这件事以及未来的就业感到迷茫。一边是希望能够在未来人机协同的创新社会中找到自己的价值与地位,一边是自己心里真的是一点底也没有。
    作者回复

    我和你有过相同的经历,但是那时我还处在本科,年龄还小,对于你的case:
    首先你要相信自己。我身边很多的同事,朋友都是半路出家,不少28,29,甚至30了才转的计算机,甚至是从文科转的。但是你也要做好心理准备,这肯定是一个漫长艰苦的过程。

    leetcode可以说是基础吧,因为算法题的练习可以锻炼你的逻辑思维。重要的是,一定要多做项目,多写,多和优秀的人交流,很多工程上的经验都是通过遇到实际问题然后去解决积累起来的。其次对于方向的问题,现在太多的人想做机器学习,我的建议是工程的开发也不要落下,比如后端开发之类的,多去通过项目了解一下自己的擅长什么和喜欢做什么,再做决定。

    最后祝你成功!

    2019-05-10 15:11:09

  • Clany

    2019-05-11 23:12:46

    老师,Python中循环结构while和for谁的效率高呢?
    作者回复

    这个看你怎么写了。代码中所有直接调用C的操作的语句肯定比通过Python间接调用C(Python的解释器是C写的)快的多。比如下面的例子B用for循环比例子A用while循环快很多,因为range这个函数是C写的,直接调用。但是i += 1这个操作得通过解释器间接调用C,而这个简单的增值操作又涉及到object的创建和删除(i是immutable的),因此相对来说很耽误时间。这个作为了解就可以啦
    (A)
    i = 0
    while i < 100000000:
    i += 1

    (B)
    for i in range(0, 100000000):
    pass

    2019-05-12 14:03:21

  • ZENG

    2019-05-10 08:52:30

    我是自学路上的,就是看视频看书,然后跟着一些demo能做出来一些东西,但是自己做的时候还是没有思路,可能练得还是太少
    作者回复

    往往需要一个需求,一个场景,多练习,多和别人交流,这样才能提高

    2019-05-10 13:06:18

  • NEVER SETTLE

    2019-05-22 00:12:50

    目前一直重点学三门语言,1. 使用C++做基础架构,2. 使用Go做服务端业务开发,3. 使用Python做算法与数据分析。
  • 水木刀

    2019-05-10 06:37:37

    困惑:
    1、学习过一阵子但工作中没怎么用,过了一段时间也就忘了。
    2、真做一个项目时,发现自己有想法,可是实现落地却是很痛苦,各种查找后都不是自己想要的效果,实现起来进度特别慢,就产生畏惧了。
    作者回复

    你和我大学里的经历一样。工程这种东西没办法,都是得逼自己去做项目,练出来的,当然最好有小伙伴一起合作,这样能够相互督促

    2019-05-10 13:14:37

  • geek_holic

    2019-05-12 01:09:27

    请问学习数据分析与建模有什么建议吗?
    作者回复

    首先熟悉基本的工具,比如机器学习的框架,TensorFlow等等,然后找一些项目练手,比如可以参加kaggle比赛。当然,最重要的是得通过实际的业务积累经验,比如大公司上亿的用户,就是很宝贵的机会,如果你能去大公司机器学习的组工作,这样海量的数据加上不停的practice和分析,肯定大有所为

    2019-05-12 14:06:37

  • Wen

    2019-05-10 07:33:06

    谢谢,看完很有收获。想请教一个问题,对于零编程基础,想通过学python找到相关岗位的工作。怎么选python方向呢?感觉其他的方向都挺难,爬虫还好,学完基础就可以做一些简单的爬虫练习项目,我选python爬虫是不是没啥问题呢?
    作者回复

    最简单的应该是数据分析的工作吧,就是用python实现一些简单的数据统计分析的功能,往往只需要高中的数学知识就够了。爬虫这种属于服务器端的工作,对于服务器端的工作,应该也不难,对数学都没有高要求,但是需要工程经验的积累。门槛最高的应该是机器学习这块,需要较高的数学基础。
    综合下来,我觉得你应该定位于服务器端的开发,自己先做项目试手,找到工作后,多积累经验,然后一步步可以更深入

    2019-05-10 13:12:18

  • Geek_c5b97d

    2019-05-11 10:25:00

    老师,能不能每日一更新,我很“饥渴“啊!
    作者回复

    哈哈。每周更新3次。每日都更新,我来不及写啊

    2019-05-12 14:11:49

  • 阿哔

    2019-05-10 20:21:23

    python小白,之前只接触过C++但是也只懂一点点最基础的东西,现在转专业,需要写代码,开始学习python,但总是感觉力不从心,再简单的问题也要去百度,别人怎么做,可能还是基础不牢固
    作者回复

    technical的问题尽量用google,可以买个代理。百度基本查不到啥的。

    你这种情况还是得多练,通过项目练习,积累工程经验

    2019-05-11 04:27:17

  • 首席民工

    2019-05-10 17:09:29

    关于字符串相加的复杂度,这个具体指什么?可以请您举个例子吗?
    作者回复

    后面会讲道。简单的来说,你认为Python中字符串相加的过程是是重新分配一块内存空间,然后把2个字符串分别拷贝进去吗?其实是不对的

    2019-05-11 04:34:34

  • 非鱼

    2019-05-10 09:15:14

    您可以推荐一些优秀项目代码
  • ahee

    2019-05-10 09:26:18

    接触python一年左右了,Django和Flask各做过一个项目,基础用法都掌握了,但就是感觉没有摸到门路,实现的功能也都是google一下相关模块,拿过来就用,希望跟着老师学习能够登堂入室
  • AI悦创

    2019-05-10 10:43:04

    脑图的第三步中编辑器没有sublime text3
    ,是不适用还有有什么原因呢?想了解了解
    作者回复

    谢谢补充

    2019-05-10 12:57:15

  • 刘鹏飞

    2020-02-25 17:52:32

    老师您好,我今年29了,有python基础,也使用python写过一些测试脚本,但是没有做过开发, 现在学python开发还可以嘛?年龄会不会太大了?
    作者回复

    没问题,都有基础了,学起来肯定很快,加油!

    2020-02-26 12:05:50

  • 南山

    2019-05-16 07:17:33

    打卡,一定不断练习,不能像以前一样光看书不练,要把知识运用到实际应用,学习新语言,要对比联想思考分析,才能把知识串起来
  • Da.L.Vinci.Hbuger

    2019-05-21 15:15:56

    老师,30岁开始入门学习Python知识,来得及么……?以后希望往爬虫这方面发展,希望老师给点学习的建议………
  • 追逐

    2019-05-14 10:21:50

    我现在马上就要转入软件工程了。
    现在是在看c++和python,不知道该如何分配时间比较好。
    作者回复

    可以同时学习。Python更适合入门,C++稍微难一些,建议学习了基本知识,多去做一些小项目

    2019-05-14 11:42:23

  • 小武

    2019-05-12 18:18:34

    确实光看是解决不了问题的,以为自己记住了语法,并且可以写出来,但是当真正写的时候确实不知道怎么使用,还是得多练习
  • Aries

    2019-05-10 16:00:45

    就好的学习方法就是给别人讲会
  • ldw

    2019-05-10 08:28:17

    我20年前学过一点点编程。后来没用全忘光了。
    python主要领域有数据挖掘和数据分析。我要把日常的数据采集和报表更新工作在ubuntu环境下通过python编程和一点shell编程实现。ubuntu用微软wsl工具下的命令行。编辑器用VI和VIM。这样不但可以练习python,还可以熟悉Linux环境和shell编程。
    作者回复

    👍

    2019-05-10 13:06:57