2018年3月15日 星期四

卡關與小確幸

玩 python 兩個多禮拜,Codecademy 已完成 75 %。

聽起來似乎進展不錯,但事實上,我在第一週就完成60%以上的進度,第二週的線上課程開始進入應用習題,我也開始了各種嚴重卡關,有時一天還解不了 2 題,極度苦惱焦慮下只好忍不住偷看解答,看到解答的瞬間才脫口而出:「啊!怎麼這麼簡單!」

是啊,解法其實很簡單,但我就是想不到。

這樣子反覆來回幾回,逐漸發現,學習python,除了是在學程式語言,更是在學一種新的思考模式。其實也不算完全新,就是邏輯思考,讓我想起高中苦讀數學的歲月。

這一切跟我上大學以後所受的人文訓練非常不同。大學所學的人文思考,就是要考量到各方各面的因素,簡言之----- 要想得夠多夠廣泛。但邏輯推論相對沒那麼複雜,設了幾個前提條件,就可以一路往下推論。現在的我得訓練大腦嘗試一種不熟悉的思考模式,因此每天都在燒腦、每天都覺得筋疲力盡。

但是,我知道自己開始改變,也漸漸熟悉程式語言的思考方式。許多時候,解python練習題時雖然未必解得出來,但大致知道這個題目要用甚麼方式處理,而當我試著寫出解答,再對照codecademy提供的解法時,發現自己只是一些細節有誤或對某個符號理解不夠,思考的方向確實都沒有錯,這時會令我感到非常興奮。

今天總算靠自己的思考,以及python提供的一點小提醒,解開了2道題目,解開瞬間真讓人開心到想跳起來大叫。其中1題是要求一個數字串的中間值(median),寫成白話文看起來真是簡單到不行,但也是花了我兩個多小時的時間.... 我的解法如下:

Codecademy: median

def median(lst):
  List = sorted(lst)
  L = len(lst)
  res = 0

  while L > 0:
    if L % 2 == 0:
      res += (List[L/2] + (List[L/2 - 1])) / 2.0
    else:
      res += List[(L-1)/2]
    return res


雖然我試圖用一些代數來簡化畫面,但不得不說看起來還是很雜亂.... 希望往後可以寫得更簡潔。這題比較難的部分應該是,要思考怎麼挑出偶數字串和奇數字串的那個中間數... 我自己抽象思考的能力沒那麼好,必須實際用好幾個範例來算,才能抓出中間數的規則。

附帶一提,我剛寫完時覺得邏輯完全沒錯,為何就是一直跑出錯誤訊息??!! debug到我頭髮都要花白了,最後瞄到Codecademy的小提示,要除以 2.0 而不是 2!! 恍然大悟! 一改之下立刻正確了,這也是我最佩服這個線上課程的地方,它總是知道新手會在哪裡犯錯 : )

然後,下面也順便看看Codecademy的答案:



科科,乍看到 Codecademy 的答案,我也是暈了,字好多@@ 不過老實說,它的解答是冗在那些代數的名稱(可能很希望讓菜鳥們看懂在幹嘛 XD),基本架構是非常清楚簡潔的,邏輯也很通順。

最重要的是,我的邏輯思考和Codecademy一致,這點頗振奮人心~!!



未來幾個禮拜、幾個月、甚至幾年,都得讓自己更沉浸在程式語言和邏輯的世界裡,就像英文一樣,程式語言也是需要訓練語感的,再接再厲吧!


沒有留言:

張貼留言