[DA series - Learn Python with Steem #05] 基本資料結構

[DA series - Learn Python with Steem] 是DA(@deanliu & @antonsteemit)關於「從Python程式語言實做Steem區塊鏈的入門」的系列,歡迎趕緊入列學習!

前情提要:[DA series - Learn Python with Steem #04] 迴圈

第#05堂課,今天我們來學習Python的~~基本資料結構

Python的基本資料結構(Data Structure)

介紹完了一些基本運算之後,我們還差一點點基本觀念就可以進入比較有「寫程式」感覺的地方了。我們這章節要教的是資料結構,也就是一些有效率儲存自己資料的方式。例如上一章的最後面我們介紹到的List(傳統稱為Array,陣列),就是一個可以想像成清單資料結構,讓我們把東西一樣一樣的放到裡面。

在我自己的經驗裡面,最基本也最實用的資料結構就是List以及Dictionary,基本上有了這兩種資料結構之後就可以很有效的解決大部分的問題了。所以我們今天就針對這兩種最基本的資料結構來做介紹。

List

首先我們來說說List。
List這種資料結構應該就是你想像得到最直觀的「清單」。首先我們可以宣告一個List,之後就可以慢慢的取用裡面所紀錄的變數(或是其他資料結構)。程式碼可以參考tutorial_5_list.py

這裡我們用一個List:my_todo_list來紀錄了三個字串,分別是今天待辦的三項事物。而 count_todo 就是my_todo_list的長度:len(my_todo_list),也就是待辦事項數量。
接著透過一個For迴圈依照順序列印出裡面的內容。執行結果:

I have 3 tasks on my todo list today! They are:
Homework
Write on Steem
Get a haircut

List有一些非常好用的method可以使用,其中最好用的就是 .append().remove()兩個。append就是加上去的意思,會把一個新的元素加到原本List的最後面。例如剛剛的my_todo_list,可以如下加入新的元素:

首先我們先看看現在my_todo_list裡面有什麼東西,接著就把兩樣新的代辦事項加入本張清單。最後我們可以再次印出目前清單裡的任務數量。執行結果如下:

['Homework', 'Write on Steem', 'Get a haircut']
I have 5 tasks on my todo list now!

原本只有三個東西的list,經過我們的兩次append之後就變成五樣待辦事項了。而相反的,當我們想要移除一樣東西時,我們可以使用.remove()

執行結果:

['Homework', 'Write on Steem', 'Get a haircut', 'Watch a movie', 'Sleep']
['Get a haircut', 'Watch a movie', 'Sleep']

更多可以使用List的操作可以參考這份官方文件。使用方法大多大同小異,就是在你的list後面加上.method名稱(參數)

另外還有一個十分重要,如何access List裡面物件的方法就是使用它的index,也就是編號。在程式語言裡面,通常第一個元素的index都是0,然後慢慢累加。所以在上面這個長度只剩下三的my_todo_list裡面,我們可以分別使用my_todo_list[0], my_todo_list[1], my_todo_list[2]來取用這三個字串:

例如

print(my_todo_list[1])

就會印出從頭數來第二個元素,也就是Watch a movie

Dictionary

接著我們來介紹另外一個實用的資料結構,就是Dictionary。在剛剛介紹的List裡面,我們只能依照順序來存取裡面的檔案,或是只有在我們知道我們要的物件在「List的第幾個」時,才可以直接用index選用。
不過,在Dictionary裡面我們可以一次存進一個Key - Value pair,也就是一個key對應一個,每次查詢的時候只要我們知道key就可以找到相對應的值。Dictionary在一個在生活中感覺比較容易想像的資料結構,就好像我們在查字典的時候,輸入Apple就會出現蘋果的相關介紹、輸入Zoo就會出現動物園的介紹,我們不需要知道Apple是字典裡的第幾個字、也不需要遍歷字典裡面所有的元素來找到他。
我們下面使用一個簡單的電話簿例子來操作。(範例程式位於tutorial_5_dictionary.py)。Dictionary的宣告是使用{ }符號,裡面則放滿了 key : value這樣的結構。要讀取資料時也跟List類似,是使用[]裡面放上你用來搜尋的key:

0906882331
876543219
Traceback (most recent call last):
  File "tutorial_5_dictionary.py", line 4, in <module>
    print(my_phone_book['Bob'])
KeyError: 'Bob'

這裡我們先在裡面存了兩筆紀錄,分別是我的與Alice的電話號碼。可以發現後面我們在取用前兩筆資料時都十分順利,直到第三比Bob的資料時,由於他並不在Dictionary裡面,所以程式就顯示了KeyError

至於要怎麼增加新的key-pair到字典裡面呢?可以使用以下幾種方法:

一種是直接使用類似Assign值的方式,以後my_phone_book裡面的 Bob值就等於後面那串數字。另一種方法算是比較正規,是使用Dictionary裡面的.update() method來做更新。使用update的好處是可以一次增加好幾筆,其實也就是字面上「以後面傳入的字典幫忙這個字典更新」的意思,如:

my_phone_book.update({'Joey':'4738273643', 'Rachel':'8372381298', 'Monica':'8327192039'})

上面的例子就是一次加入了一大堆新的資料到原本的my_phone_book裡面。

如果有一天,你想要列出所有的人還有電話,也可以使用一個for迴圈來遍歷整個字典。但是寫法有一點小小的不同,要使用dictionary.items()來當作被遞迴的主體,才能同時看到key跟value。


執行結果:

Joey     : 4738273643
myself   : 0906882331
Monica   : 8327192039
Rachel   : 8372381298
Alice    : 876543219
Bob      : 09080706023

其中還有其他有用的method。例如可以列出所有的key的.keys():

print(my_phone_book.keys())

結果:

['Bob', 'Alice', 'Monica', 'Rachel', 'myself', 'Joey']

更多的method或細節依然可以參考比較完整的官方文件,我個人是覺得這些就滿夠用的啦!

Homework time:練習題!

今天我們學了兩大資料結構,就來練習一下他們與迴圈的結合吧:
題目:使用一個python程式,製造出一個dictionary和一個list:dictionary的key是1~10的整數,value分別是他們的平方。而list則是紀錄了1~10的三次方 ([1, 8, 27,...,1000])。最後分別列印出這個list和dictionary。

參考解答: tutorial_5_exercise.py

我們下篇文章再見囉~下課!

class-377117_1280.jpg
image - pixabay

Sort:  

哈哈,来交作业
图片.png

虽然不看你的课外总结我勉强能看懂,一部分靠猜的,但是我还是去补习下吧~

我找到一個叫codecombat的學python網站,很好玩

对呢 这个网站通过游戏学挺有意思 周围很多朋友用来教小孩子学

我是小孩子

别怕 我比你还小

image.png
看完评论我觉得我的有点啰嗦,哈哈哈!@yjcps你可以当助教了~

personally, for the print... I prefer
print(f'I have {count_todo} tasks on my todo list now!')

hw5.png

Dictionary 不懂使用.format(key,value),所以多了{ },怎麼辦?

@antonsteemit ...

Posted using Partiko Android

你這個呼叫外援的操作真的666666🤦‍♀️

他不是外援,是老師,我只是討論課綱的跟開教室的人 LOL

若是印出整個dictionary 就會有含 {}
你的hw_list本身就是一個字典,所以直接印出來就會出現 {}包在字典外圍。

.format的用法是將字串中的某一個東西取代為函數中的東西
例如' 今天是 {} 月 {} 日'.format(5,19)
就會分別把5, 19填入兩個框框之中: 今天是5月5日
以你的例子可以寫成:
print(' {} : {} :{} '.format(m, hw_list[m], a))

明白,謝謝解答,讓我再試試🙏🙏🙏

我這週專門安排了一個下午準備抱著電腦去研究1-5,還請了外援😂總覺得以我的IQ可能會問題比學到的東西多

得此英才,夫復何求?

Posted using Partiko Android