Lecture 7: Lists and mutability, dictionaries, pseudocode, introduction to efficiency.
本课介绍的内容比较多,比较杂,但都是非常基础细小的知识点。本课介绍了列表的另外一个基本操作:赋值。另外,本课也简要介绍了字典,伪代码以及效率。
列表的赋值操作可以改变列表内元素所关联的值。通过List[0] = Value这样的形式进行赋值。其中[0]是列表中第一个元素,这个在前面的课程中已经提到过了。
但是在使用列表赋值的语句时需要注意一点:是否存在其他变量也对应了此列表,那么改变此列表中的元素,会导致所有对应这个列表的变量进行改变。
举个简单的例子,我有如下程序段(1):
L1 = [1, 2, 3]
L2 = L1
L1[0] = 4
print L1
>>> [4, 2, 3]
print L2
>>> [4, 2, 3]
这就正如我上面所提到的,由于L1和L2都对应[1, 2, 3]这个列表,改变这个列表的第一项,会导致L1和L2都改变。
但是,再看这个程序段(2):
L1 = [1, 2, 3]
L1 = L2
L1 = [4, 2, 3]
print L1
>>> [4, 2, 3]
print L2
>>> [1, 2, 3]
我们就发现程序段(1)和程序段(2)的差别在于(1)改变了L1和L2,而(2)仅仅改变了L1。这是由于(1)改变了所对应列表本身,而(2)则是改变了L1和列表的对应关系,使L1重新对应了一个新的列表[4, 2, 3],同时,L2保留了原有的对应关系,即L1对应的仍然是[1, 2, 3]
因此,在写程序的时候特别要注意这种细微的地方,一不小心就会出现错误。
字典(Dictionaries)可以当做是列表的高级形态,不过它的括号是大括号,而不是方括号。它有以下三个最显著的特点:
(注意:由于没有一定的元素号码,我们就需要在key里设定这个元素的号码,因此就有了<key, value>这样特殊的形式)
<key, value>这样的形式可以这样理解,比如我们有一个单词"abcdefg",它的解释是这样的"a boy can do everything for girls" (^~^) 那么我们把它写成这样的形式:
dict = { "abcdefg" : "a boy can do everything for girls" }
当我需要用到这个解释的时候,我就只需要使用那个单词就好了。我可以这样做:
print dict["abcdefg"]
>>> "a boy can do everything for girls"
这样就变得非常简便了。当然我们也可以把这个解释存到列表里面去,但是它所对应的元素号码就仅仅是自然数了,达不到解释说明的效果。所以把它输到字典里面,简单明了,通俗易懂,调用起来也非常方便。
相信在后面的课程中,会遇到更多的使用字典的例子,在这里就不累述了。
下面讲的是伪代码(Pseudocode),这是一个非常实用和有效的方法。它便于我们整理思路,在写复杂程序的时候,它就是我们的“操作指南”。
【注意】 对于初学者而言,在写任何较为复杂的程序之前,一定要先写好伪代码,明确自己到底要做什么。虽然看上去会花一些时间,但是在写程序的时候就会速度非常快,因为已经明确了每一步要做什么。相信尝试伪代码之后,初学者会有更深刻的体会。
最后,本课简单介绍了效率,以及效率的重要性。这里涉及了一些计算机的历史和内部结构。本人认为,本课所讲的效率和算法远不如《算法导论》(第二版)来的深刻,但是简单易懂,适合初学者学习。如果想进一步更全面的了解效率和算法,可以参考《算法导论》的书,也可以学习MIT另外一个课程“算法导论”。相信各位会对那个长发飘飘的号称MIT最年轻教授印象很深刻的。
总结:本课内容比较杂,但都很简单,略过即可。