Python代码找bug(10)
上期的代码设计需求:
两个 3 行 3 列的矩阵:
X = [[12,7,3],
[4 ,5,6],
[7 ,8,9]]
Y = [[5,8,1],
[6,7,3],
[4,5,9]]
请实现其对应位置的数据相加,并返回一个新矩阵。
代码如下:
请大家仔细阅读代码,找出其中的bug!
正确答案:共有2个问题。(对答案时间,看看答对了几个?)
(1)一个是真正的bug。请注意range()方法的参数,此处不仅是希望以X矩阵式列表长度为循环的最大次数,而且,也是循环变量i的取值范围,i将会是X列表的索引标号。所以,它的起始值不应该是1,而应该是0,因为索引都是从0开始计数的。相应地len(X)也就无需再加1了。后面的嵌套循环亦如是。
(2)另一个是需要代码优化的问题,这不能完全算是bug,因为程序是可以走通的。但是,我们说代码应该尽可能的简洁,包括不要写重复的代码。很多时候,我们解决问题的思维方式也会直接影响我们编写代码的复杂程度。在上面这段代码里,我们定义了一个空的列表R,用于存放矩阵运算后的返回值。于是,在后面的第一轮循环中,我们又定义了一个空的列表Z,用于在第2轮循环中存放X矩阵和Y矩阵的一个对应行相加的结果,循环结束,这个结果,可以添加到R列表中。看起来,思路是没有问题的,但是,能否更简洁一些呢?为什么不一开始就定义一个二维的R矩阵呢?这样我们不是可以直接将X矩阵和Y矩阵的计算结果直接更新到R中吗?没错,肯定可以这样。然而这两者的差别不是形式上的,而是思维的习惯性复杂度问题。我们总是习惯用一维线性的方式按顺序考虑问题,不习惯多维方式的并行思考模式。这个案例,恰好能够帮助我们去思考这样的问题。想想吧,X[i]和X[i][j]有什么区别?哪个效率更高?Python为什么总会定义一些相对复杂的数据结构,就是为了让处理问题的逻辑变得简单,毕竟处理问题才是目的。
所以,正确的代码应该是这样的:
点评:这个代码找bug问题,主要目的:
(1)学习矩阵,认识多维数据的表达式。
(2)巩固基础语法,熟练掌握range()方法的多种参数应用。
(3)训练对复杂数据结构的熟练应用能力。
对以上代码理解还有困难的同学,请翻阅和学习高渡号外前面发送的《Python入门》,或者高渡网站的《Python轻松入门》视频课程。
本期代码设计需求:互换两个变量的值。
代码如下:
经过了几期相对复杂问题的考验,本期来点简单的。当然,上面的代码还是有bug的。请找出来,发到留言里,明天对答案。
正确答案明天揭晓。
提醒:惯例所有代码都是基于Pythpn3 的哦。