跌跌撞撞製造二維list

閱讀時間約 2 分鐘
在武俠世界中,各門各派都有自己獨門的絕學。其實程式語言也一樣,每種程式語言也都有自己的一套。當然囉,武功絕學得好好保護,不可輕易外傳或被偷學;而程式語言呢,則是大家互相觀摩,互相漏氣求進步。所以啊,武功絕學就一個一個失傳,而程式語言則是互相吸取優點,越來越進步。
comprehension應該可說是Python的絕學之一吧。不過既然是絕學,總是會有讓人容易在運氣時一個不小心走錯經脈的地方。現在我需要一個二維的list,利用comprehension來造一個,應該是再好不過的選擇。只是這地方,就是個容易出錯的地方。
一開始是這麼寫的:
universe = [[0 for x in range(width)] for y in range(height)]
這個寫法ok,只是覺得有點囉唆。後來想到這樣寫:
universe = [[0]*width]*height
嘿!清爽多了,不是嗎?實際執行看看,的確印出來的,就是個塞滿0的二維list。這時候還真是有點佩服自己,能把原來囉哩囉唆的寫法,給改寫成這麼簡潔的寫法。
在繼續往下寫之前,想到好像在官網的文件上,曾經看到有關多維list的主題。會不會有更好的寫法?嗯!應該先看看再繼續。果然!在Programming FAQ裡頭,就有一個主題是在講如何造多維list。
呃……好吧!上面比較短的寫法是錯的。因為用「*」來複製list所得到的,是指向現存物件的reference,而不是真正的list物件。所以啊,「*height」所造出來的,是一個list,這個list含有height個reference,而這些reference都指向同一個長度為width的list。所以當改變universe裡頭某列元素的值時,每一列相同位置的元素都會被改掉。所以正確的寫法應該長這樣:
universe = [[0]*width for y in range(height)]
在其他網站看到,在迴圈部分,也可以寫成這樣:
universe = [[0]*width for _ in range(height)]
這個寫法倒沒什麼太特別的技術原因,純粹就是寫作風格而已。底線(underscore)代表的是:這個東東的值沒啥重要的,在迴圈裡頭也不會用到,不值得在意。既然這樣,那就用底線代替y,省得以後看程式時,會懷疑y是真的沒用到,還是寫錯、漏掉了。這主意不錯!可以避免一些麻煩,也讓程式讀起來更明確。寫程式時,如果能多考慮後續維護、除錯時的問題,就能節省很多時間,也能避免很多錯誤。就像地下管線要留人孔,方便維修;電線的地線、火線顏色不同,方便辨識一樣,寫程式時多費些心思,絕對是好處多多!
為什麼會看到廣告
avatar-img
15會員
131內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
蝦蜜?!Python沒有內建array?!剛發現這件事時,還真的有點傻眼,怎麼會沒有array這麼好用的data type呢?
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
在看官網文件時,看到一份文件:PEP 8 -- Style Guide for Python Code。這份文件是關於Python程式碼風格的指引和建議。
讀完文件,接下來就是要動手了。第一步要先安裝Python。爬了些文,最後決定安裝Anaconda。
蝦蜜?!Python沒有內建array?!剛發現這件事時,還真的有點傻眼,怎麼會沒有array這麼好用的data type呢?
寫程式時,很傷腦筋的一件事,就是變數的名稱該怎麼取。其實變數名稱隨便取,並不會影響程式的正確性,但對程式的可讀性,以及後續的維護,那可就影響深遠了。
第一個要拿來練功的題目是:Game of Life。
呼!寫文章真是比寫程式還要燒腦、燒時間。一開始是沒想到要寫這「隨筆」的,是有天程式寫著寫著,腦海中就冒出這麼個想法來,要把跟Python交往的過程寫下來。
在看官網文件時,看到一份文件:PEP 8 -- Style Guide for Python Code。這份文件是關於Python程式碼風格的指引和建議。
讀完文件,接下來就是要動手了。第一步要先安裝Python。爬了些文,最後決定安裝Anaconda。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,tuple 與 List有一個關鍵的不同點:tuple 是不可變的,這意味著一旦創建了 tuple,就無法更改其內容。 這與 List的可變性形成了對比,list 可以新增、刪除或修改元素。 元素的意思: 元素:指的是 List 中的每一個獨立的項目或值。
在處理數據時,最可能會遇到數據中含有None的時候,若沒有處理就進行運算就會造成程式崩潰或者報錯 數據中含有None input_list = [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2), (None, None
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
NumPy(Numeric Python)是Python中用於科學計算的核心庫之一。它提供了高性能的多維陣列對象(即ndarray)以及用於處理這些陣列的各種函數和工具。 在NumPy中,有幾個常用的指令可以用來創建陣列
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
Thumbnail
在程式中,了解資料型態是相當重要的。 為什麽? 因為許多error,常常都是因為資料型態不正確所導致的。 舉個例子,在python中: a = 1 + 2 print(a) 結果就是3 a = = "1"+"2" print(a) 結果就是12 是不是差很多? 所以今天我來介
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,tuple 與 List有一個關鍵的不同點:tuple 是不可變的,這意味著一旦創建了 tuple,就無法更改其內容。 這與 List的可變性形成了對比,list 可以新增、刪除或修改元素。 元素的意思: 元素:指的是 List 中的每一個獨立的項目或值。
在處理數據時,最可能會遇到數據中含有None的時候,若沒有處理就進行運算就會造成程式崩潰或者報錯 數據中含有None input_list = [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2), (None, None
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
NumPy(Numeric Python)是Python中用於科學計算的核心庫之一。它提供了高性能的多維陣列對象(即ndarray)以及用於處理這些陣列的各種函數和工具。 在NumPy中,有幾個常用的指令可以用來創建陣列
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
Thumbnail
在程式中,了解資料型態是相當重要的。 為什麽? 因為許多error,常常都是因為資料型態不正確所導致的。 舉個例子,在python中: a = 1 + 2 print(a) 結果就是3 a = = "1"+"2" print(a) 結果就是12 是不是差很多? 所以今天我來介
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞