前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >极简是Python的灵魂 | Python代码找bug(10)

极简是Python的灵魂 | Python代码找bug(10)

作者头像
高一峰
发布2020-09-22 10:16:49
7760
发布2020-09-22 10:16:49
举报
文章被收录于专栏:高渡号外

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 的哦。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高渡号外 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档