天天看點

極簡是Python的靈魂 | Python代碼找bug(10)

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]]

請實作其對應位置的資料相加,并傳回一個新矩陣。

代碼如下:

極簡是Python的靈魂 | Python代碼找bug(10)

請大家仔細閱讀代碼,找出其中的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為什麼總會定義一些相對複雜的資料結構,就是為了讓處理問題的邏輯變得簡單,畢竟處理問題才是目的。

是以,正确的代碼應該是這樣的:

極簡是Python的靈魂 | Python代碼找bug(10)

點評:這個代碼找bug問題,主要目的:

(1)學習矩陣,認識多元資料的表達式。

(2)鞏固基礎文法,熟練掌握range()方法的多種參數應用。

(3)訓練對複雜資料結構的熟練應用能力。

對以上代碼了解還有困難的同學,請翻閱和學習高渡号外前面發送的《Python入門》,或者高渡網站的《Python輕松入門》視訊課程。

本期代碼設計需求:互換兩個變量的值。

代碼如下:

極簡是Python的靈魂 | Python代碼找bug(10)

經過了幾期相對複雜問題的考驗,本期來點簡單的。當然,上面的代碼還是有bug的。請找出來,發到留言裡,明天對答案。

正确答案明天揭曉。

提醒:慣例所有代碼都是基于Pythpn3 的哦。