将零碎的知识点体系化真的很重要,我就把这门课的所有要点都放在一张思维脑图(是体系化知识的好工具)里了。
整个 Python 基础内容我把它结构化为六点:
从下面动图可看出每个点的更多细节。
按上面这种方式划分构建一个体系是有原因的:
编程概论:学习任何一种编程语言,我们都需要了解一些概论。类比计算机语言和人类语言,学习语言首先要了解其词汇和语法,再开始讲故事。
了解完概论就可以了解所有编程语言中最重要的一环,数据。
数据:数据的重要性不需要多讲,在 Python 中数据可分两大类:
数据会被命名成变量,变量(词)之间会发现联系(句子),当你试着「用词造句讲故事」的时候,你实际创建了一个流程,而流程需要控制。
流程:类比三种演绎故事的形式,代码也可以按顺序写、按条件写(if)、重复写(while, for),这些都叫做流程控制,当然在运行不出错的时候。如果出错了需要异常处理(try, except)。因此流程控制可细分
当你想重复使用一组语句时,你需要考虑函数。
函数:Python 定义函数有两种方式:
Python 把函数当成「一等公民」,即可把函数当成变量使用,进而可以定义高阶函数(普通函数和匿名函数都属于低阶函数):
介绍完数据和函数后,我们可得出
如果同时要处理到数据和行为呢?考虑对象和类。
对象和类:对象是既具有数据又具有行为的实例,而类是对象的描述。变量和函数是零散的,而对象将它们集合起来,
字段和方法统称为类的属性(attributes)。
基于对象编程叫做「面向对象编程」,里面的知识点包括:实例变量、类变量、实例方法、类方法、静态方法、继承、多态、魔法方法、属性装饰器等。
高级特征:这是都是些锦上添花的东西,包括格式化字符串、正则表达式、解析表达式、生成器、迭代器和装饰器等等。
现在我已经把整套课的体系建出来了,当然每个知识点还有很多细节要去深挖。学习一个新事物时,我痴迷于去体系化其要点,去对比和类比其性质、这样知识点会越来越明晰。
体系化可以把握全局
故事总是比代码更能让人感兴趣,尤其以 Python 的难点「装饰器」为例,如果一上来就给装饰器的代码 @decorate_function,没有多少人能坚持学下去的。但是如果将它赋予故事呢?
故事开始
斯蒂文是个厨师,有一天开始研究汉堡 (burger) 的做法,第一次他只用鸡肉饼做汉堡。
def meat(food='--鸡肉饼--'):
print(food)
burger = meat
burger()
--鸡肉饼--
很明显汉堡都是肉,太荤了。加点蔬菜如何?
def vegetable(func):
def wrapper():
print(' ~西红柿~')
func()
print(' ~沙拉菜~')
burger = vegetable(meat)
burger()
~西红柿~
--鸡肉饼--
~沙拉菜~
现在汉堡看起来不错,可是好像看缺少了什么?对,再加点面包就好了。
def bread(func):
def wrapper():
print('</------\>')
func()
print('<\------/>')
return wrapper
burger = bread(vegetable(meat))
burger()
</------\>
~西红柿~
--鸡肉饼--
~沙拉菜~
<\------/>
现在看上去真像汉堡,面包夹着蔬菜,蔬菜夹着肉。
故事结束
面包和蔬菜「装饰」着鸡肉饼,bread() 和 vegatable() 这两个函数起着「装饰器」的作用,它们没有改变 meat() 函数,只在它的基础上添砖加瓦,最后把鸡肉饼装饰成汉堡。
我相信即便你在还不太懂 Python 函数的情况,也能大概了解装饰器的作用了。
除了故事化,我在讲难点时喜欢把所有需要的知识点过一遍。比如装饰器涉及到函数的各种用法,我会在讲装饰器前,揉碎了讲下面几个知识点:
这样你们学起来会很轻松,但对我而言就要下很大功夫,但是我愿意。
故事化可以引人入迷
一图胜千言,人是感官动物,从图表中接收的信息绝对比从文字快。
在学习高阶函数 map, filter, reduce 的时候,绝大教材都会直接上代码这样举例:
lst = [1, 2, 3, 4, 5]
map_iter = map( lambda x: x**2, lst )
list(map_iter)
[1, 4, 9, 16, 25]
f_iter = filter( lambda x: x%2==1, lst )
list(f_iter)
[1, 3, 5]
from functools import reduce
reduce( lambda x,y: x+y, lst )
15
虽然可以看懂,但是总觉得不直观。再看看我是如何来「可视化」这三个函数的。
我们看着 Emoji,很自然的就能读懂
这样是不是秒懂 map, filter 和 reduce 了?
再举一个我最喜欢的例子,「可视化」列表解析式。
你可以把「带 if 的 for 循环」到「解析式」的过程想像成一个「复制-粘贴」的过程:
通过这样的可视化过程,你发现列表解析式原来这么简单直观啊。
可视化可以增强记忆
从具体问题能抽出本质是一种很重要的能力,人一旦会举一反三才算会学习。
以格式化字符串举例,一般有四种方法:
如果光看例子,那真是千奇百怪,但透过例子看本质,每种方法都有通用的语法格式,如下图总结。
记住那么多特例是不可能的,但记住这四种通式是可行的。