关键词: CS4挑战 MIT-6.0001
0. 前言
这是我CS4挑战计划开始的第一门课程,前前后后大概花费了一个月的时间。中间伴随着很多的杂事,所以MIT挑战一周一课的进度对于我来说是不切实际的,更何况开始这门课程学习之前我还有一定的Python基础。回归主题,本文就是对MIT 6.0001课程的回顾与总结。
1. 课程材料
1.1 课程介绍
MIT 6.0001 Introduction to Computer Science and Programming in Python是MIT面向本科生的入门级的计算机课程,适用于编程初学者或编程经验不足者(说的不就是我嘛😭)。这门课旨在帮助学生理解计算在解决问题所起到的重要作用,能够帮助不同专业的学生拥有编写小型程序解决问题的能力。本课程使用的语言是Python3.5。
1.2 课程资源
课程的官网在这里。官网基本上提供了课程所需的所有材料,包括课程视频,课程作业,以及课程PPT。
如果觉得官方网址的视频太卡太模糊,可以查看油管视频这里,当然你需要科学上网。油管看视频的好处是可以设置字幕,同时也可以调整观看倍速。如果没办法科学上网的话,B站上也有up主上传了视频,关键词搜索6.0001应该就可以得到结果,这里就不贴地址啦。
另外课程并没有给出课程作业的答案,也就是没有编程练习的官方Solution。Github上有很多6.0001的仓库,但有的并不是很全,这里就恬不知耻地贴上自己的6.0001编程练习,欢迎有缘人批评指正提issue。
2. 课程总结
2.1 课程概述
本课程主要是培养编程初学者的计算思维,借以Python语言,阐述了表示数据的数据结构以及数据之间交互的方法(迭代和递归)。同时引入模块化编程的思想,再引申到面向对象编程思想。最后结合相应的排序算法来分析和评价程序的效率。整套课程的思路非常明确,在介绍程序设计思想的同时,也结合具体Python程序带领学生入门编程。
2.2 课程详述
Lecture1:主要介绍了计算(computation)的概念,从知识的两种分类(陈述性知识和程序性知识)出发,引出如何让计算机实现类似人类获取程序性知识的能力,也就是让计算机学会计算。然后简单说明了存储程序计算机的结构,以及程序语言的相关知识。一个正常的程序应该避免语法错误(syntatic errors)、静态语义错误(static semantic errors)和实际运行不符错误(different meaning than what programmer intended)。最后介绍了Python程序的表达式和数值运算,以及Python变量的含义和使用。
Lecture2:主要介绍了程序设计中的分支(branch)和迭代(iteration)的概念。首先说明了Python的string
类型,Python的输入输出显示可用print()
和input()
函数来实现,且需要注意input()
函数的返回值类型为string
类型。其次介绍了Pythonif-elif-else
条件分支结构和while
、for
循环迭代结构。在循环迭代结构中,我们可以使用break
语句跳出最里层的循环结构,break
语句后的程序将不再被执行。最后比较了for
循环和while
循环的不同。在知道确切循环次数的情况下,一般使用for
循环,若不清楚循环结束的边界,即使用while
循环。
Lecture3:主要介绍了Python中关于string
类型的一些操作和三种求平方根的算法。可通过len()
函数来求得字符串的长度,字符串还可通过索引(indexing)来截取字符串中我们需要的信息。另外需要注意的是string
类型是不可变类型(immutable)。然后介绍了三种求平方根的方法—猜检法、渐进法和二分法。
Lecture4:主要引入了程序设计中的分解和抽象思维,并且介绍了Python函数的使用。分解的目的是将程序模块化,抽象的目的是将程序的具体实现细节隐藏,只提供相应的使用接口,Python函数的作用即实现分解和抽象功能。然后着重强调了Python变量作用域的概念,同时比较了print
和return
的区别。在Python变量作用域中,我们需要注意的是,我们可以在函数里访问函数外的变量,但不可修改变量的值。若确实需要这种操作,则需定义变量为全局变量。
Lecture5:主要引入Python复杂数据类型元组(tuple)和列表(list),并介绍了其各自的特性和相关方法,还说明了列表同名(aliase)和克隆(clone)的区别。元组是不可变类型,列表为可变类型,表示单个元组时,不要忘了添加逗号,如('mit',)
。列表同名意味着指向同一值的多个变量,一旦通过一个变量修改了值,这种修改就会在其它变量得以体现。这时就需要通过克隆来避免上述操作可能带来的负面效果。另外要区别sort()
与sorted()
函数的不同。sort()
函数是直接对原列表内容进行排序,返回值是None
,sorted()
则不对原列表内容进行修改,返回值是排序后的列表。
Lecture6:主要引入了程序设计中递归的思想,并引入了Python字典(dictionary)数据类型。递归的核心思想在于分而治之,把规模很大的问题分成相同的规模较小的问题,再从较小问题出发解决问题。使用递归要求有一个基础解(base case),然后递归地解决更大的问题。字典的组成是一对对key-value
对,需注意的是,字典的key
值必须是不可变类型。
Lecture7:主要介绍了Python如何测试(testing)和调试(debugging)程序,同时说明了Python的异常处理和断言的使用。测试包括单元测试(unit testing)、回归测试(regression testing)和集成测试(integration testing)。测试也分为黑盒测试(black box testing)和白盒测试(glass box testing)。黑盒测试是穷举输入测试,并不清楚程序内部的结构和路径,而白盒测试是穷举路径测试,对每个程序路径都进行相应的测试。用try-except
结构来捕获Python程序运行中出现的异常,用关键字assert
来判断Python程序的运行结果是否同预期相同。
Lecture8:主要引入了Python面向对象思想(OOP)。Python万物皆对象,对象由类的实例化所得,其包含着数据和操纵数据的方法。类中的__init__
方法用来实例化一个对象相关的数据属性。我们可以通过重写类中的__str__
函数来设定我们想要打印对象的信息。
Lecture9:主要介绍了Python的类和继承。Python中获取对象某个数据属性或者设定某个数据属性最好通过getter
和setter
方法实现,不建议直接通过.
操作符来进行访问。Python的子类继承父类的所有参数属性和方法,在子类的__init__
函数里,可通过调用父类的__init__
方法来减少重复代码的编写。
Lecture10:主要引入了如何评价程序效率的方法。从一开始在程序中使用计时器来计算出程序的运行时间,到通过对程序运行操作技术来比较程序效率,再到抽象出程序增长级的概念更加通用高效地评价程序的执行效率。最后引出了Big O的概念。
Lecture11:进一步地通过具体的程序案例来解释程序时间复杂度的概念。通用的比较是$O(1) < O(logN)<O(N)<O(N*logN)< O(N^c) < O(c^N)$。
Lecture12:主要介绍了最常见的三种排序算法:冒泡排序(bubble sort)、选择排序(selection sort)和归并排序(merge sort),并穿插以说明三种排序各自的时间复杂度。最后对6.0001课程进行了回顾和总结。
3. 课程评价
虽然是读了软件工程的研究生,但是这门MIT的本科生入门课程还是让我收获颇丰。课程作业也进一步地锻炼了我使用Python的能力,至少现在可以毫不费劲地写出归并排序的代码了,这也算是一个小小的进步吧😭。
课程评价:😀😀😀😀😀
课程作业:😀😀😀😀😀
自我评价:😀😀😀😀
道阻且长,行则将至