SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
資料結構
Report
Justin Lin
Follow
Technology / Community Evangelist at Free lancer
Aug. 17, 2016
•
0 likes
•
1,825 views
1
of
62
資料結構
Aug. 17, 2016
•
0 likes
•
1,825 views
Download Now
Download to read offline
Report
Software
《Python 3.5 技術手冊》第 9 章投影片
Justin Lin
Follow
Technology / Community Evangelist at Free lancer
Recommended
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
4.2K views
•
91 slides
Java SE 8 技術手冊第 9 章 - Collection與Map
Justin Lin
4.9K views
•
81 slides
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin
2.3K views
•
50 slides
Java SE 8 技術手冊第 3 章 - 基礎語法
Justin Lin
5.3K views
•
52 slides
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
2.5K views
•
68 slides
從模組到類別
Justin Lin
1.7K views
•
62 slides
More Related Content
What's hot
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
3.2K views
•
91 slides
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
2.2K views
•
126 slides
9. 資料結構
Justin Lin
284 views
•
73 slides
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
5.3K views
•
66 slides
進階主題
Justin Lin
3K views
•
61 slides
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
1.9K views
•
48 slides
What's hot
(20)
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
•
3.2K views
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
•
2.2K views
9. 資料結構
Justin Lin
•
284 views
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
•
5.3K views
進階主題
Justin Lin
•
3K views
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
•
1.9K views
14. 進階主題
Justin Lin
•
400 views
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
•
2.1K views
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
•
2.6K views
5. 建構式、原型與類別
Justin Lin
•
205 views
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
•
2.2K views
4. 使用物件
Justin Lin
•
174 views
CH09:Collection與Map
Justin Lin
•
286 views
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin
•
2.8K views
5. 從模組到類別
Justin Lin
•
165 views
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
•
3.1K views
Java SE 7 技術手冊投影片第 06 章 - 繼承與多型
Justin Lin
•
2.5K views
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Justin Lin
•
3.6K views
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin
•
4.4K views
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
•
2.6K views
Viewers also liked
open() 與 io 模組
Justin Lin
1.8K views
•
40 slides
從 REPL 到 IDE
Justin Lin
2.3K views
•
27 slides
例外處理
Justin Lin
1.4K views
•
62 slides
網站系統安全及資料保護設計認知
Justin Lin
3.8K views
•
97 slides
Python 起步走
Justin Lin
7.2K views
•
26 slides
OpenSCAD Workshop
Justin Lin
2.1K views
•
56 slides
Viewers also liked
(20)
open() 與 io 模組
Justin Lin
•
1.8K views
從 REPL 到 IDE
Justin Lin
•
2.3K views
例外處理
Justin Lin
•
1.4K views
網站系統安全及資料保護設計認知
Justin Lin
•
3.8K views
Python 起步走
Justin Lin
•
7.2K views
OpenSCAD Workshop
Justin Lin
•
2.1K views
流程語法與函式
Justin Lin
•
2.6K views
Python Programming Essentials - M22 - File Operations
P3 InfoTech Solutions Pvt. Ltd.
•
1.5K views
Python Programming Essentials - M44 - Overview of Web Development
P3 InfoTech Solutions Pvt. Ltd.
•
1.8K views
除錯、測試與效能
Justin Lin
•
1.7K views
資料永續與交換
Justin Lin
•
1.8K views
類別的繼承
Justin Lin
•
1.4K views
Python 3 Programming Language
Tahani Al-Manie
•
11.4K views
《Python 3.5 技術手冊》第二章草稿
Justin Lin
•
4.5K views
Python
Shivam Gupta
•
33.8K views
並行與平行
Justin Lin
•
2.6K views
PyCon Taiwan 2013 Tutorial
Justin Lin
•
290.9K views
3D 之邏輯與美感交會 - OpenSCAD
Justin Lin
•
1.4K views
型態與運算子
Justin Lin
•
1.8K views
常用內建模組
Justin Lin
•
1.4K views
More from Justin Lin
Ch14 簡介 Spring Boot
Justin Lin
859 views
•
22 slides
Ch13 整合 Spring MVC/Security
Justin Lin
279 views
•
58 slides
Ch12 Spring 起步走
Justin Lin
261 views
•
31 slides
Ch11 簡介 JavaMail
Justin Lin
155 views
•
8 slides
Ch10 Web 容器安全管理
Justin Lin
152 views
•
30 slides
Ch09 整合資料庫
Justin Lin
229 views
•
92 slides
More from Justin Lin
(20)
Ch14 簡介 Spring Boot
Justin Lin
•
859 views
Ch13 整合 Spring MVC/Security
Justin Lin
•
279 views
Ch12 Spring 起步走
Justin Lin
•
261 views
Ch11 簡介 JavaMail
Justin Lin
•
155 views
Ch10 Web 容器安全管理
Justin Lin
•
152 views
Ch09 整合資料庫
Justin Lin
•
229 views
Ch08 自訂標籤
Justin Lin
•
131 views
Ch07 使用 JSTL
Justin Lin
•
154 views
Ch06 使用 JSP
Justin Lin
•
245 views
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
199 views
Ch04 會話管理
Justin Lin
•
235 views
Ch03 請求與回應
Justin Lin
•
228 views
Ch02 撰寫與設定 Servlet
Justin Lin
•
336 views
CH1. 簡介 Web 應用程式
Justin Lin
•
1.1K views
13.並行、平行與非同步
Justin Lin
•
233 views
12. 除錯、測試與效能
Justin Lin
•
148 views
11. 常用內建模組
Justin Lin
•
140 views
10. 資料永續與交換
Justin Lin
•
148 views
8. open() 與 io 模組
Justin Lin
•
242 views
7. 例外處理
Justin Lin
•
114 views
資料結構
2.
9.資料結構 • 學習目標 – 認識
hashable、iterable、 orderable – 對物件進行排序 – 認識群集架構 – 運用 collections 模組 – 運用 collections.abc 模組
3.
hashable 協定 • 試圖在
set 中置放這些型態的實例,就會 引發 TypeError:
4.
• 一個物件能被稱為 hashable,它必須有個 hash
值 • 這個值在整個執行時期都不會變化, 而且 必須可以進行相等比較 • 具體來說, 一個物件能被稱為 hashable, 必須實作 __hash__() 與 __eq__() 方法
5.
• set 會對加入之物件,呼叫其
__hash__() 方法取得 hash 值 • 看它是否與目前 set 中既有物件的 hash 值都不相同 – 如果相同就會直接排除而不加入 – 若都不相同,則進一步使用 __eq__() 比較 相等性,以確定是否要加入 set 之中
6.
• 對於 Python
內建型態來說,只要是建立後 – 狀態就無法變動(Immutable)的型態,它的 實例都是 hashable – 可變動(Muttable)的型態之實例,都是 unhashable
7.
• 一個自定義的類別建立的實例,預設也是 hashable 的 –
其 __hash__() 實作,基本上是根據 id() 計 算而來 – 而 __eq__() 實作,預設是使用 is 來比較 – 因此,兩個分別建立的實例,hash 值必然不相 同,而且相等性比較一定不成立
8.
• 什麼樣的狀態會被認定為重複,還是要自 行定義 __hash__()
與 __eq__():
10.
• hashable 物件,建議狀態是不可變動 •
兩個物件若是相等性比較成立,那麼也必 須有相同的 hash 值 • 然而 hash 值相同,兩個物件的相等性比較 不一定是成立的
11.
iterable 協定 • 具有
__iter__() 方法的物件,就是一個 iterable 物件 • 傳回的迭代器具有 __next__() 方法,可 以逐一迭代出物件中,的資訊,若無法進 一步迭代,會引發 StopIteration • 迭代器也會具有 __iter__() 方法,傳回 迭代器自身,因此,每個迭代器本身也是 個 iterable 物件
13.
• 對於狀態比較複雜的物件來說,有時產生 器不見得適合時,就會親自實作 __iter__()等方法來建立迭代器
15.
• 同樣的需求,也可以使用產生器來實作
16.
• 標準程式庫有許多情況下,都接受iterable 物件,在內部自動呼叫 __iter__() •
若 lt 是[1, 2, 3, 4, 5]: –set(lt) 會建立 {1, 2, 3} –tuple(lt) 會建立 (1, 2, 3, 4, 5)
17.
• 標準程式庫中提供了 itertools
模組,當 中許多函式,可協助建立迭代器或產生器
18.
• accumulate() 可在迭代的過程中進行累 加或指定的運算: •
chain() 或 chain.from_iterable() 可將指定的序列攤平逐一迭代:
19.
• dropwhile()、takewhile()、 filterfalse()
20.
• 有時候會需要依某個鍵來進行分類
21.
• 使用 itertools
的 groupby() 函式可以 省事許多:
22.
orderable 協定 • 如果打算對一個
list 進行排序,可以直接 呼叫它的 sort() 方法,這會在既有的 list 上進行排序:
23.
• 也可以使用 key
參數,指定要使用哪個值 進行排序:
24.
• list 才有
sort() 方法 • 對於其他 iterable 物件,若想進行排序的 話,可以使用 sorted() 函式,可指定的 參數同樣也有 reverse 與 key 參數 • 此函式不會變動原有的函式,排序的結果 會以新的 list 傳回
25.
• 如果是自訂的類別實例,它們怎麼會知道 該怎麼排序呢?
26.
• 如果希望自訂型態在 sorted()
或者是使 用 list 的 sort() 時,可以有預設的排 序定義,必須實作 __lt__() 方法:
28.
• 可以指定 operator
模組的 itemgetter,、 attrgetter,前者可以針對具有索引的 結構,後者可以針對物件的屬性:
30.
認識群集架構 • 群集分為三種類型: – 循序類型(Sequences
type) – 集合類型(Set type) – 映射類型(Mapping type)
31.
• 循序類型都是有序、具備索引的資料結構, 循序類型都是 iterable
物件
32.
• tuple、str 與
bytes 是不可變動的循序 類型,具有預設的 hash()實作 • 可變動循序結構,還會有以下的操作行為:
33.
• 集合類型是無序,而且元素必須都是 hashable 物件而且不會重複,它們是 iterable
物件 • 可以使用 x in set、x not in set、 len(set),以及交集、聯集、差集與對稱 差集等操作 • set 本身是可變動的,如果想要不可變動 的集合類型,可以使用 frozenset() 來 建立
34.
• 映射類型可以將 hashable
物件映射至一個 任意值 • Python 中的內建型態就是 dict
35.
• 如果想實作先進後出的堆疊結構,可以使 用 list,運用
append() 與 pop() 方法
36.
• 對於佇列或雙向佇列來說,使用 list
的效 率並不好 • 建議使用 collections 模組中提供的 deque 類別
37.
• 有個 rotate()方法,可實作出環狀佇列
38.
• 如果想要有個簡單類別,以便建立的實例 能擁有欄位名稱,實際上不用自行定義, 而可以使用 collections
模組的 namedtuple() 函式
40.
• 如果來源是個 iterable
物件, 除了 Point(*iterable) 的方式之外,還可 以使用 Point._make(iterable) 建立 Point 實例
42.
• 若想以一定的順序來走訪 dict
中鍵值
43.
• 如果想要在建立 dict
時保有最初鍵值加入 的順序,可以使用 collections 模組的 OrderedDict
44.
• 依鍵排序或依值排序的常見需求:
46.
• 用 collections
的 defaultdict 類別 • defaultdict 接受一個函式,它建立的實 例在當指定的鍵不存在時,就會使用指定 的函式來產生,並直接設定為鍵的對應值
47.
• 使用 defaultdict
來設計一個計數器
48.
• collections 模組中就個
Counter 類別
49.
• 可以指定一個 dict
給 Counter,它會依 dict 中值的指定,建立對應數量的鍵
50.
• 有多個 dict
物件,想要將它們合併在一起
51.
• 可以使用 collections
的 ChainMap 來 達到相同的目的
52.
• 如果透過 ChainMap
指定更新某對鍵值, 會在底層中第一個找到鍵的 dict 中更新對 應的值 • 若底層全部的 dict 都找不到對應的鍵時, 就會直接在第一個 dict 新增鍵值
53.
• ChainMap 底層維護的
list,可以透過 maps 屬性來取得
54.
• new_child() 方法可以指定dict,這會 建立一個新的
ChainMap,當中來源 ChainMap 中的 dict 並包含指定的 dict • 如果想建立新 ChainMap,不包含來源 ChainMap 的第一個 dict,可以使用 parents 屬性
55.
• 想要實現 []
取值,可以實作 __getitem__() • 想要實現 [] 設值, 可以實作 __setitem__() • 若想透過del 與 [] 來刪除, 可以實作 __delitem__()
58.
• collections.abc 模組中提供了許多實 作群集時的基礎類別 •
開發者繼承這些類別,可以避免遺忘了必 須實作的方法,也可以有一些基本的共用 實作
59.
• 方才自行實作的 ChainMap,可以改繼承 MutableMapping,以更符合
dict 的物 件協定:
61.
• Mapping 並不是
dict 的子類別,只是擁 有 dict 的行為 • Sequence 也不是 list 的子類別,只是 擁有 list 的行為 • Set 也不是 set 的子類別,只是擁有 set 的行為
62.
• 只是想要基於 str、list、dict
等行為,增 加一些自定義方法,可以使用 collections 的 UserString、UserList、UserDict