在學習新事物的時候,如果能善用類比、聯想等小技巧,往往能事半功倍,但也是有可能會碰壁的。
就以「橫的」和「直的」來說,在很多不同的領域,都有這樣概念的東東。例如,GPS定位的「經緯度」、排隊、列隊的「行、列」、英文的「column、row」。那這些不同的字詞中,哪個指的是「橫的」,哪個指的是「直的」?要好好區分並記住這些,還真是挺傷腦筋的,往往今天搞清楚記得了,過沒兩天又搞混了。最後還是靠一點類比、聯想的小技巧,才能不再搞混。
「經緯度」中的經、緯兩個字,本來指的是織物中南北向的直線,以及東西向的橫線。那哪個字指的是南北向的直線呢?台灣人很喜歡去日本旅遊,日本的首都一般都說是「東京」(其實日本沒有正式的首都啦!)。所以囉!在經緯度中,有「東經」,沒有「東緯」。既然是「東」經,那當然是直的囉,只有一條條的直線,才能讓人區分出東、西不同的地點嘛!畫一下圖就知道了。
那英文的column和row呢?這個最好認了,column裡頭,那根直挺挺杵在那兒的英文字母「l」,不就是在告訴你:直的!直的!我是直的!
至於「行列」,那可就讓人頭大了,因為大家都隨便用、混著用。有時候隨便用、混著用還不至於引起誤會,而產生什麼大問題,但有時候可是會出大麻煩的。例如中文書有直的和橫的兩種印刷方式,但不管是哪一種印刷方式,我們都會用「第幾頁第幾行」這樣的說法。這樣子不分直的、橫的的用法,反正也不會讓人找不到要找的地方,所以大家也就不那麼在意。但是啊,要是在資料庫的table中這樣用,那可就麻煩了。如果老闆要你把table的某一行刪掉,結果你刪掉橫的那一串,那可就不妙了。「行」是直的,「列」是橫的,不過據說在中國大陸,用法剛好相反,「行」是橫的,「列」是直的。反正不管在哪裡都很容易搞錯,所以最好的辦法,就是在使用的時候,不要只單說「行」、「列」,說成「直行」、「橫列」,那就不會有問題了。也許有人會說,既然是資料庫的table,那幹嘛不說「欄位」而說「行」?真是不專業,這樣也敢出來混?!這樣說也對啦!不過,人家是老闆,是給你薪水的那位耶!你,想要薪水的你,還有什麼意見嗎?
學新的東西時,除了應用一些小技巧外,如果也能從過去學過的東西觸類旁通,那學習效率可以提高不少。程式語言百百種,而且不斷推陳出新。如果能從過去學過的語言中汲取經驗舉一反三,面對新的語言,很快就能進入狀況,不過也要當心,不能太想當然耳的套用,畢竟不同的程式語言,可能會有類似但不同的設計。
在決定一個cell在下一代是生是死時,必須去算他周邊的八個cell中,有多少個是活著的。因為universe是list,所以用slicing的方式來處理,應該是比較好的做法。以前學過matlab,所以對於Python的slicing並不覺得有什麼太難理解的。當然啦,概念是差不多,但語法還是有些不同,這是要注意的。
一維list的slicing其實挺單純的,語法也簡單,就是把要的那一些element取出來而已。不過universe是二維的,而且現在是要計算一個九宮格裡頭,除了中心那格之外的八格,值是1的共有幾格。所以,如果能把九宮格裡頭的element取出,形成一個新的list,然後用sum()加總,再減去中心那個element的值,那就大功告成了。那要怎麼把九宮格裡頭的element給取出來呢?如果現在是要處理universe[y][x]這個cell,那根據matlab的語法,以及一維list的slicing語法,很自然的會寫成universe[y-1:y+2][x-1:x+2]。這寫法看起來挺漂亮的,不過天不從人願,稍微測試一下,就知道這樣的寫法是錯的,二維list的slicing,可不是原來想像中那樣的。
以a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]這個list來說,a[1:4][1:3]得到的會是[[9, 10, 11, 12], [13, 14, 15, 16]]。乍看之下,實在看不懂是怎麼回事。在網路上找了半天,在二維slicing這個問題上,絕大部分都是要人用numpy這個module的array來寫,只有少數文章有提到二維list的slicing,不過都搔不到癢處,看了老半天,還是腦袋一團亂,只好自己猜測歸納、自己測試。
奮鬥了老半天,突然靈光一閃,喔~~~原來是這麼回事!原來,a[1:4][1:3]的作用,就相當於
b = a[1:4]
b[1:3]
這可以理解成[1:4]和[1:3]是用來做slicing的operator。既然作用看來像是operator,那應該可以再來一個,試試看便知道。結果一如預期,a[1:4][1:3][0:1]得到的是[[9, 10, 11, 12]]。既然如此,那就給他繼續下去,試看看a[1:4][1:3][0:1][1:3]。結果得到[[]],沒了!那a[1:4][1:3][0]呢?得到[9, 10, 11, 12],而a[1:4][1:3][0][1:4]得到[10, 11, 12]。
總算摸清楚二維list的slicing了!也許不該叫二維list,講巢狀list會比較好。講二維list,是因為長得像二維的array,可在做slicing的時候,根本就和幾維沒關係,完全就是「巢狀」的概念。嚴格來說,list和array是完全不同的東西,只是長相和用法在很多地方很相像,所以利用array的概念來學list,會比較容易進入狀況。不過千萬要提醒自己,它們畢竟是不同的東西,不能完全的類比,不然可是會有苦頭吃的。