自学两周,刚刚在踩过无数坑,成功跑通了一个小爬虫(在 linkedin 找到做过某项业务的产品经理,并把他们的项目等信息写入一个文件)之后,我想总结一下 Python 的学习。
Python 里最难的概念是什么?
这里的概念,我指的是构成 Python 的基本概念,是其他概念的基石,不包括诸如 “xx模块”这样的基于基石的概念。
Python 的基石概念,我认为有变量、列表/字典、函数、类。(有些可能也是所有编程语言的基本概念,不了解其他语言,大神轻拍,下同)
这些概念是由浅入深的层级关系:
有关形状(空间)
- 一级概念:变量
- 二级概念:列表、字典(变量及变量间联系)
有关输入输出(时间)
- 三级概念:函数
- 四级概念:类(函数及函数间联系(时空概念))
时间和空间我等下再提。先解释下层级。列表、字典是在变量基础之上,可以描述变量之间关系的概念,因而比变量高一个层级。
我刚学这一块时就遇到了一个难点,随便举个例子:
假如有个列表
names=['monica','rachel','joey',ross']
要给每个名字加上 ‘hot ’,变成例如 ‘hot monica’,最简单怎么改呢?我一开始总想用 for name in names 去改,虽然也可以(生成新变量,删掉原列表的内容,再把新变量加到原列表中),但是更方便的是:
for i in range(len(names)) :
names[I]='hot '+names[i]
所以,列表比变量高级的地方在于,它还能表达变量间的关系。列表的“位置”概念(或者说属性)就是一种变量间关系。而 for name in names 实际上还是从变量的思维在考虑。
函数比前面两个概念难的地方是在于它是一个时间概念。先有输入后有输出。而列表、字典只有组合、位置这样的空间概念。所以函数会更难。(但我们高中都学过可能不觉得难。)关于时间和空间概念可以参考我的另外一篇文章《产品经理的时空思维》。
类:最难的基石概念
刚学类的时候,觉得类是一个好东西,定义好了一系列通用方法,遇到类似场景传个参数调用一下,就可以出结果。像个万能模子。
但实际根本不是这么一回事。
先看一个《Python编程:从入门到实践》的例子:
现在要做一个简单的问卷,可以收集用户输入的答案。
已经有了类 AnonymousSurvey ,你要怎么用呢?
函数2、4是可以直接给到输出的函数,但必须先定义 变量 question、response/responses。
question 是需要我们提供的参数,而 response/responses 需调用函数3。
而调用函数3 需给到变量 new_response, 这是我们需要给到的参数。
所以这里的步骤是
- 提供参数 question 调用函数2,得到输出
- 提供参数 new_response -> 调用函数3,获得变量 response/responses -> 调用函数4,得到输出
所以并不是你在入口提供参数 question、new_response, 你在出口坐等函数4的输出就好了。你需要参与制作提供给函数4的变量。
我把函数2、4这样的可以提供最终输出的函数定义为“输出函数”,把函数1、3这样的幕后工作者定义为“功能函数”,它们只有辅助功能,参与制造用于输出的关键变量,而不直接输出。把 question、new_response 这样需要我们提供的函数定义为“参数变量”,把 response/responses 这样的在类里面的,只承担功能但无需提供的变量叫做“功能变量” 。
为了更清晰,罗列一下:
- 参数变量:question,new_response
- 功能变量: response/responses
- 功能函数:1,3
- 输出函数:2,4
我作为小白刚学习类时,看到上面那个调查问卷的问题就傻眼了:这里的变量都可以直接拿来用么?调用哪个函数呢?
但现在就会明白,功能变量可以直接用,但参数变量需要定义。类中的函数,不是全给你直接输出的,有些是用来创造功能变量的。
所以类并不是一个模子,你丢进去原料,出来成品。类也不是一个超市,罗列了很多工具,你挑选合适的工具,得到需要的输出。类是给到你原料和工具,你用一部分工具和原料创造一些关键配件,然后再用剩下的工具和你创造的配件来制造成品。
类经历了这么一个过程:
参数变量,功能函数 -> 功能变量 -> 输出函数
所以它不仅有函数和函数关系这样的空间概念,还包括上面的时间关系,因而我觉得是最难的概念。
掌握了基石概念,就能学会 Python 吗? Too naive…在自己写代码时还会有各种问题,很重要的一点是由于编程语言思维和我们日常解决问题的思维是不一样的。留待下一篇讲。