:::success ## 陣列資料結構_Python的array和list **【以ARCS作為學習活動架構】** ::: :::info 注意(Attention):使用生活化的類比方式,引起學生對程式設計的興趣。 關聯(Relevance):將程式設計與學生的興趣和日常生活情境相結合,讓學生認識到程式設計的實際應用價值。 信心(Confidence):設計具有挑戰性但可以成功完成的任務,並及時給予學生積極的鼓勵和建設性的反饋,以逐步增強學生的信心。 滿足(Satisfaction):提供豐富的學習體驗,讓學生在學習過程中感到樂趣和成就感。 ::: :::info - 學習表現: - 運 t-IV-4能應用運算思維解析問題 - 運 t-V-2 能使用程式設計實現運算思維的解題方法 - 運 p-V-1能整合資訊科技進行有效的溝通表達 - 學習內容: - 演算法(A) - 資 A-V-3 演算法效能分析 - 程式設計(P) - 資 P-V-1 文字式程式設計概念與實作 - 資 P-V-2 陣列資料結構的程式設計實作 ::: --------------------- :::warning ### 第一節課 介紹陣列資料結構的基本概念 共一節,50分鐘 ::: - 陣列的歷史 - 起源:需要能夠容納多個數據元素的結構 - 早期發展:已成為一種<b>基本的資料結構</b>,早期的計算機語言如Fortran和COBOL都有陣列資料解構 - 進化:使用變得更加廣泛和多樣化 - 性能和效率:快速訪問和修改元素 - ==陣列是什麼==? - 陣列就像是電腦裡的書櫃一樣,可以放資料在裡面。陣列的<font color="#F1422E"><b>記憶體空間是連續的</font></b>,就像書櫃是一層一層堆疊的。而陣列的大小也是固定的,像是書櫃的大小是固定的,無法任意放大或縮小。 - 陣列就像書櫃一樣,可以放置不同的資料。根據資料的內容不同,所需的空間就不同。假如書櫃的每一層只能放一本書(一筆資料),每一個格子代表會耗費的實體空間(記憶體空間)。<u>(以下範例以C++為例)</u> - ![temp](https://hackmd.io/_uploads/rJ9tCaLrC.png) - 宣告陣列 - 因為陣列的種類、大小不能隨意變動,所以在宣告陣列時,必須說明陣列的變數類型和分配的空間大小。 - Ex:宣告一個陣列,哈利波特小說系列共有7集 ![temp](https://hackmd.io/_uploads/H1B_qA8r0.png) - 想一想除了剛剛舉例的書櫃之外,還有什麼日常生活中的例子概念與陣列相符?與小組討論,並將討論結果紀錄在學習單上。 - Practice:哈利波特的故事中除了佛地魔之外,還有許多反派角色,右圖為一張網友們所票選出最「受歡迎」的壞蛋,請用紙筆的方式先嘗試「宣告這個變數」 - 變數種類選擇 - 空間決定 - STEP 1:我們要確定的是變數的種類,因為我們資料為「字串」,因此變數種類應選擇string - STEP 2:接著需確認這個陣列需要多少空間,右圖共有7位反派角色的人名,因此需要7個儲存資料的空間(以C++為例) - <font color="#F1422E">PS.變數名稱無強制規定,但以易於辨識、有意義為原則 </font> - 宣告完變數僅代表我們已經向電腦申請了空間來放資料了,資料需要怎麼做才能放進空間呢? - 我們可以將資料像書一樣,一格一格的放進櫃子(空間)裡。 - 延伸練習 - 不同種類的變數所耗費的空間也不同,這代表什麼意思? - 陣列的開頭從0開始,為什麼? - 使用陣列還可以解決什麼樣的問題請舉例,並嘗試規劃你是怎麼想的。 :::warning ### 第二節課 Python中的array 共一節,50分鐘 ::: - Python NumPy的歷史 - 起源:Python中的list(下節課內容)對於大型數據的速度較慢 - 發想:Travis Oliphant等人於2005年創建了NumPy,使Python能夠輕鬆處理大型資料和進行高效的數值運算 - 優點:高效、可計算、可視化 - 回顧 - 還記得上節課以C++為例的陣列嗎? - 傳統陣列 vs. 非傳統 Ex:C++ vs. Python - <font color="#F1422E">傳統不一定很老很老!</font>(C++:1983,Python:1991) - Numpy array最大的特點在於強大的向量運算能力,想一想在現今電腦科學領域中可以怎麼運用呢?與小組討論,並將討論結果紀錄在學習單上。 - Practice:新學期霍格華茲魔法學院的魁地奇比賽有了新賽制,比賽分為A、B組。統計分數時,隊長的分數可以*1.5倍,副隊長的分數可以*1.2倍,請幫忙統計總分並判斷最後的贏家。 - ![image](https://hackmd.io/_uploads/rkkSf1PHC.png) - import numpy as np - NumPy Array的算數 - STEP 1:共有A、B兩組,因此需宣告2組Array,變數使用int計算即可。 - STEP 2:對隊長、副隊長原始分數進行加權,並進行組內總和。 - STEP 3:最後進行條件判斷比較A、B兩組分數大小。 - 延伸練習 - NumPy Array各種變數是如何進行運算的? - 有沒有什麼規則或是限制?不同變數間也可以做運算嗎? :::warning ### 第三節課 Python中的list 共一節,50分鐘 ::: - Python-list的歷史 - 早期發展:創造一種易於閱讀、學習和使用的程式語言,list在Python中是一種非常基本且常見的資料結構。 - 優點:可包含任意類型的資料結構、動態調整大小 - 性能和效率:具有高靈活性,但在<b>處理大量資料時效率低</b> - 想一想為什麼Python的list會比較慢呢 - 回顧上週學習內容上週NumPy Array與這周的Python List - <font color='green'>NumPy Array 指向連續資料的指標</font> - <font color='blue'>Python List 一筆資料,一個指標</font> ![temp](https://hackmd.io/_uploads/H1txuUvBA.png) (資料來源:https://jakevdp.github.io/blog/2014/05/09/why-python-is-slow/) - 宣告list - 變數 = [],Ex:names=[];也可直接放進元素,Ex:names=["哈利波特","妙麗","榮恩"] - <b>靈活性</b>:大小可動態調整、隨時可刪除或增加元素 - <b>多樣性</b>:同一個list的資料型態可以是不一樣的 - 複習:基本陣列、NumPy array 與 list - 我們已經學會了使用最基本的陣列的概念和NumPy array - 想想看,list該怎麼使用最適合?與小組討論,並將討論結果紀錄在學習單上。 - 課堂活動:哈利波特、榮恩和妙麗等人來到了迷幻森林要來採集魔藥學課堂上要用到的藥草。請先將教授所需要的<font color='red'>藥草名用list記錄下來</font>,採到藥草之後,再<font color='red'>刪除</font>此藥草名。 - 宣告list - <b>Append()、Erase()</b> - STEP 1:創建list,將所需的藥草名用<font color='red'><b>append()</b></font>的方式,一一加入清單中 - STEP 2:教師帶領學生便是藥草,若出現在清單中,則<font color='red'><b>delete()</b></font>此藥草 - 延伸練習 - 我們已經知道list的記憶體空間是非連續性的,而傳統array的記憶體空間是連續的,討論看看兩者之間的執行速度、空間大小、搜尋時間各有甚麼異同! - 之前遇到的問題皆為一維陣列(array、list),若是二維該如何進行宣告?可以運用在那些地方呢? :::warning ### 第四節課 Python中的array和list的實作專題 共一節,50分鐘 ::: - 課堂活動:<u><b>黑魔法防禦術、變形學、符咒學、魔藥學、草藥學、天文學和魔法史</b></u>是霍格華茲魔法學院的必修科目,右邊的陣列分別是<i><b>葛來分多、赫夫帕夫、雷文克勞和史萊哲林</b></i>的平均成績,請對這些資料進行分析。 - import numpy as np - NumPy Array的算數 - ![image](https://hackmd.io/_uploads/B1iK98PSR.png) - 各個學院的平均分數 - 各個學院的中位數科目 - 各科分數平均 - *嘗試使用list統整出最後的解答! - 最後的考驗:歲月如梭,哈利波特一行人就快要畢業了,衛斯理夫婦為了孩子們準備大量的禮物,共有12位畢業生會來參加宴會,一個畢業生可以選擇6樣禮物,可以重複拿同一種禮物,請幫助衛斯理夫婦清點最後剩下的禮物。 - 禮物: - 接骨木魔杖*10 - 魔法書*20 - 飛天掃帚*8 - 隱形斗篷*12 - 魔法藥水*25 - 魔法石*50 - 規則:<font color='red'><b>可使用list,也可使用array</b></font> - TIPS:可與小組成員討論要如何使用正確的資料結構幫助設計程式碼