[新手Python 應用搭建指南] 1. 基礎資料結構

Even Pan
14 min readMar 8, 2022

--

本系列文章我將手把手的帶你們完成應用程式專案。從選題,找資料,探索資料,最後進而搭建出應用並且部署在網頁上讓你可以秀給你的媽媽,老闆或是阿娜答。

關聯文章目錄

4篇轉職工具箱 Four weeks to reach even better

4篇新手Python 應用搭建指南

如果我現在馬上開始展示code,絕對讓興沖沖走進來的新手直接跪在鍵盤上,然而要搭建一個應用需要用到的程式知識卻也不是三言兩語可以輕鬆說完。我決定取一個折衷,我會帶著大家走一些基礎的內容,我覺得一定要會的,然而當我在進行課程設計的時候,我有參考一些網路上比較有名的資源,我發現我還是丟三落四,無法很完整的羅列出所有必要的重點

我承認,接下來的教學可能會讓你們像中間的蜘蛛人學生,心中大喊著: [誰快來教教我發生甚麼事情]

圖片來源 yahoo新聞 + 2創字幕

所以我決定在一開始就先提供你們最好的線上資源,讓你們能夠完整的自己跟著走過所有重要的內容

  1. 莫凡(中文)
  2. 骆昊 jackfrued
  3. Udacity
  4. datacamp
  5. codecademy

上面的內容我最喜歡的是Udacity的python基礎課,因為是高品質剪輯的短影片型教材搭配課後打鐵趁熱的練習

datacamp像在講ppt,並且有比較多的歐系或印系英文,在短影片的學習可能還在適應老師的口音影片就結束了,所以在聽力還不是特別好的同學可能要斟酌這點。 datacamp是我提升data相關能力最主要的管道,這個之後有機會可以專文再推薦一篇。

codecademy則是文章類型,如果是下班還很上進想要學習的同學,就要評估自己的專注力能不能讓自己長時間看英文文章不會失焦… 另外codecademy現在沒有免費的python系列課程,需要剛開始上課就要課金也是需要衡量的一個點。

最後為中文比較安心的同學們附上了兩個精選的中文教材

其中莫凡是我在學AI基礎觀念的時候認識的,裡面講的觀念淺顯易懂並且用視覺化的方式講解,後來他的課程越來越完整,現在你可以一路從基礎python學到AI影像 NLP,華文世界最專業的線上課程老師之一。

另一位駱昊老師則為我們整理了新手五十天需要按部就班學會的東西,滿適合需要有一個明確進度安排分配指引的同學。 以上的課程都推薦給大家

我在學習任何東西的時候很喜歡一個概念 :

Learn OOO the hard way 有時候笨方法,硬方法可能是你前往知識的最易路徑,也許一開始快不起來,但是很多知識是連貫的,讓自己基礎紮實絕對是走的更遠的不二法門。 在將來的工作中,技術債往往不是最可怕的事情,而是認知跟不上所產生的問題,在沒有戰功的不對的戰場,你奮勇殺敵,滿身泥濘,回頭才發現那些人不該是敵人,這時才後悔莫及。建構基礎是避免盲目的最好方法,找到該蹲的馬步,在該沉著的時候沉著。回頭來看,這才是真正的捷徑。

線上課程講完了,接下來來說我覺得第一周最核心需要學會的內容

  1. 執行環境
  2. print & 註解
  3. datatype
  4. input

執行環境

最適合新手的工作環境是google 提供的colab,這個環境甚至可以整合gpu,讓你可以訓練簡單的AI模型。新手有個很常見的專業就是把環境搞壞,你可以在這個虛擬機裡面做各式各樣的嘗試,如果不幸的你覺得你的機器很奇怪,你可以重啟他就好,如果是在自己的電腦上發生,你可能會開始煎熬自己是不是要重灌(通常不需要那麼麻煩,但是對自己的環境感到失望焦躁的確是新手學習語言的門檻)。因此我建議可以在剛起步的時候可以到colab盡可能不害怕的把手弄髒,胡搞瞎搞。進而找到程式運作的模式,並且錯誤中學習永遠是快速進步的不二法門。

首先我們前往大家都很會使用的google 雲端硬碟

到你想創建檔案的目錄後,使用New來新增檔案
點選 More 後,再點選 Google Colaboratory
看到這兩個甜甜圈就搞定了,可以到反選那個地方改檔名
打完程式碼可以執行(按下那個紅框處的按鈕)看看,可以注意到第一次執行會比較久,因為虛擬機需要初始化,等到第一個格子跑出結果後,後面就會是正常的速度了

第一個例題我們跑的是 a = 1 ,

  1. 我們宣告了一個變數a(python可以不用指定變數的型別,也就是我們可以突然指定a 是一個"字串",也可以是數字或甚至是一個清單,這一點比很多語言都還要自由)
  2. 我們賦值那個叫a的變數 1 這個值。
  3. 第二行我們使用print()這個內建function。 print()括號裡面放的內容物會被列印到輸出的區域,再這個colab的介面,是一種叫做notebook的介面,會將輸出放在每一個單元(cell)下方,就會如上圖所示的看到1這樣一個輸出,notebook還有一些有趣且方便的特性,但這不是全部的python共用的特性
你可能會覺得不用放print也能印,幹嘛沒事放個print()還要多打很多字,但其實這種特性只有再jupyter notebook 這種介面會出現,其他python的.py檔執行等,不會自動幫你輸出的。
這裡有另外重要的兩點,剛剛被我們賦值過的a 我們可以重新賦值成別的值,原本的值就被我們複寫掉,另外我們可以用井字號#來執行註解,註解的地方可以放一些給人類看的解釋性文字,(ex. 你可能覺得你寫出一個驚天地泣鬼神的好演算法,你太講解釋來龍去脈,那你就可以在這邊把你的辛酸血淚打下來。)

好了,你們一經掌握一些很重要的觀念了,分別是變數賦值,視窗輸出以及註解

你現在已經可以確保你跟機器之間的溝通無虞,並且可以留下註解怕隔天的自己記性沒有好到可以記住昨天的自己在寫什麼的時候,可以偷瞄一下註解提醒一下自己。

接下來我們來進入今天第二重要的環節,就是資料型態

現在打開我已經先偷偷整理好的一篇筆記本

# int

int 就是整數,可以是正數跟負數,當你寫a = a+1 的時候可以用來增加其的值,上面展示其精簡寫法(a += 1) 可以少寫一個a,厲害的程式設計師都會don't repeat yoursel(DRY原則)

# float

浮點數用於小數的計算,注意很多位小數點以外會有捨入誤差,不可以用於金融系統的應用

# string

字串,很常用來表示各式的文字,使用者輸入進來也會被統一轉成字串

通常我們在組合輸出(print)的時候也是把輸出組合成字串,這裡要多介紹一些string format的技巧,首先是format, 先創造一個裡面空的大括號的字串,接下來在format後面放進按順序的內容。 如上圖 b 是2.3, c是abc, 就被按照順序分別安插在原字串 " {} x {} "的前後,輸出為 “2.3 x abc”

下面則是我目前最喜歡的表示方式,使用f-string功能,可以把內容直接填入我們要放的字串中,並且會自動將變數內容轉成string後留在原地,好處是寫的時候直觀,事後檢查也不用去數格子方便很多

# list

接下來是同等重要的 List, list 是python的瑞士刀,最萬用的資料結構,你可以透過append 來把單個資料點塞進去,也可以透過extend插入多筆資料,插入的資料會可以被print印出成 [資料1, 資料2]的結構,範例中我推了兩個不同的資料型別進到list中,這在某些語言也是很叛逆的行為,array為了記憶體優勢,通常不能吃多型別。python 這種跨型別放在同一個list不是最佳實踐,但是可以達成

上面展示list append更多資料點進去,並且透過list[index]來讀取特定的資料點,我最先append進去的資料是”Name: ” 所以讀取的時候使用even_info[0],注意python 數數的起點是0,從零開始的第一個資料點就是”Name: ”

最後一個print我使用e[1:4]這個被稱作list 的切片,我將list其中的特定元素取出,只顯示我關心的那些元素,

[1:4]這個標記的閱讀方式為: [從1開始(包含) 到 4前方結束(不包含)]

由於python是從零開始看,所以會略過第一個數字,然後到第五個前面,所以就分別取 第2, 3, 4 三個數字

上方的範例展示了python 兩個內建方法( range 與 len)

range是python用來產生一系列數列的方法,它可以回傳一個輸入長度的range object,我知道超級像火星文的,我們可以先把它轉成list,然後把它print出來看是甚麼東東,有沒有意識到剛剛學的print超級好用,這東西根本偷窺控神物aka 程式照妖鏡,你想知道裡面到底發生甚麼東西,就把它轉成你認識很久的list() 或是 str() 讓它乖乖給你看就好了

另一個len 簡單來說它就是一支尺,它回傳它量測的東西有多長,使用方式為 len ([a,b,c]) ,如上例,有三個元素在裡面,len就會回傳3

最後一個範例可以注意到list的一個特性,就是內容物(元素)可以被改寫,我將g_list[1]抽換成99,python允許我對list裡面的元素進行改寫,這個行為叫mutable我們可以在之後的tuple看見不可改變的行為(immutable)

# tuple

如上圖所示,咱們脾氣比較硬的immutable,tuple桑 ,不讓我們更換其中的元素,一個也不行。 看到這裡每個仙女都想把自己的年紀用tuple鎖在18歲了對不對? 下次去銀行開戶填年紀的時候,就跟行員說: [你這個年齡欄位可以幫我弄成tuple嗎? 我不想這個數字再變了XD]

# bool

bool 是 我們常用作邏輯判別用的一種型別,True 與 False 屬於這個類別, 非黑即白,我們在if else會進行更完整的解說

# set

set 有一個很重要的特性,它可以進行重複的篩選,出現過的元素只留下一次,unique, 唯一性,聽到這些關鍵字就可以馬上想到set 的功能。

# dict (hash table)

最後我們來看一下dict,dict是一個非常重要的資料結構, 因為不管是插入還是讀取都可以得到O(1)的時間複雜度,意思是說,不論你要放的東西多大,不論你已經有多大的資料集當你在做下一個行為時都不影響其性能。新手聽到這邊可能比較蒙,簡單來說就是,快狠準。

dict是一個由大括號夾住一堆 key value pair 的一種資料結構,範例中前面的a, b, c是 key,後方的數字是value
  1. 拿著key去問dict, 如果剛好那個dict存在於dict中,就可以回傳答案value給你
  2. 當你拿著不存在於dict中的key,它會臭罵你一句”keyError”,注意它的語氣,這時候它是氣急敗壞的,很兇地帶著英腔罵你一句"keyError"
  3. 我們要怎麼讓這個dict老紳士不要那麼生氣呢,你必須客氣地問他。客氣詢問dict的句構為dict_name.get(‘key’),這時候如果沒找到的時候,他也會客氣地回你一個None
  4. 而如果你客氣的詢問dict, 讓他幫你get一個存在的key, 他就會回你那個key所能找到的value. 跟我們原本直接用[‘key’]問的回傳是一致的

那這個資料結構對麻瓜來說有甚麼好處呢?

這時候我們來回顧一下剛剛我想要存我們even_info於list時遇到的問題

上面的例子中,我們假想一個情境,今天Even 使用的語言是JavaScript. 在這樣的情況下,我們應該要怎麼寫呢?

由上面數下來第四個,改成javascript, 這樣應該可以交差,嗎?

糟糕,我們數錯了,由於python是從0開始數,所以我數的4應該是3才對,更慘的是,我還把原本應該是Age的欄位名稱複寫掉了,這顯然不是一個好結構,那我們能怎麼避免這個問題呢?

答對了,就是Dict

當我們把剛剛上面跟value混在一起容易被複寫掉的key獨立在key的位置

有沒有豁然開朗,同時我們拉取資料的時候也變單純。下方示範不同的創建方式與取資料的範例程式碼

寫成dict還有別的好處,我們可以在之後學到for迴圈後再來好好介紹

這裡先給你們聞香一下,感受一下dict與for迴圈連用的方便與強大。剛剛上面我們每創建一個key,在print的時候就需要多加一行來進行描述,這裡我們可以將輸出步驟自動化。直接拿key, value來用

你慢慢蹲的著馬步,聚沙成塔。你正像千層蛋糕一樣累積你的美妙滋味

最後我們來講一下input的功能,當你希望收到使用者的輸入的時候可以使用

它會跳出一個提示使用者輸入的區塊
在你完成輸入之後,你可以將使用者輸入存成變數,就可以拿來應用
有些人可能會很興奮的想把輸入當數字來做運算,這裡必須提到,輸入都是默認為string
稍微改了一下轉換輸入型別為int後,就得到正常的結果拉
Photo by Joshua Earle on Unsplash

謝謝你願意收看到這邊,能到這邊的你們都完成很了不起的事情。回頭自己在這個colab裡面測試自己學到的資料結構們,改一下資料,把題目換成自己的資料集。

你們在我的ipynb檔案裡面應該是沒有編輯權的,如果想要自己有自己的副本可以在檔案裡面找到副本按鈕,你可創建一個你可以存檔的版本

選單中間,在雲端硬碟中儲存副本

怕有人找不到連結,這裡再提供一次連結

Have fun, have a good day!

下一篇文章預計會帶到的內容

  1. if else
  2. for while
  3. function
  4. class

這篇乾貨滿滿的內容下,是我孜孜不倦的努力,儘管已經有草稿的情況下其實也打了5+小時,另外感謝David大神以及心雅的校稿,讓我在光速打字的同時能夠有良好的文章品質,再次謝謝你們。

如果你喜歡這篇文章,可以按下方的手掌幫我拍手,最多可以拍五十下,另外你也可以追蹤我,這樣就不會漏掉我最新的發文~~

--

--

Even Pan
Even Pan

Written by Even Pan

Technical blogger who like to held hands-on ml workshops. Fast-paced learner and highly interested in the latest technologies.