SlideShare a Scribd company logo
1 of 71
4. 流程語法與函式
• 學習目標
– 認識基本流程語法
– 使用 for Comprehension
– 認識函式與變數範圍
– 運用一級函式特性
– 使用 yield 建立產生器
– 初探型態提示
2
if 分支判斷
• 程式區塊使用冒號「:」開頭
• 之後同一區塊範圍要有相同的縮排
– 不可混用不同空白數量,不可混用空白與Tab,
• Python 的建議是使用四個空白作為縮排
3
• if 可以搭配 else
4
• if..elif..else
• if..else 運算式語法
5
while 迴圈
6
• 跟 while 搭配的 else
7
• 若不想讓 else 執行,必須是 while 中因
為 break 而中斷迴圈
8
• 建議別使用 while 與 else 的形式
9
for in 迭代
• 想要循序迭代某個序列
• 使用 range() 函式
10
• 使用 zip() 函式
• 使用 enumerate() 函式
11
• 迭代時具有索引資訊
• 預設 enumerate() 會從 0 開始計數
12
• set 也實作了__iter__()方法,可以進
行迭代
• 想要迭代 dict 鍵值的話,可以使用它的
keys()、values()或 items()方法
13
• for in 也有個與 else 配對的形式
• 建議別使用 for in…else 的形式
14
pass、break、continue
• pass 就真的是 pass,什麼都不做
• break 可用來中斷 while 迴圈、for in
的迭代
• 在 while 迴圈中遇到 continue 的話,此
次不執行後續程式碼,直接進行下次迴圈
15
16
for Comprehension
17
18
• 巢狀結構也是可行,不過建議別太過火
• 取得兩個序列的排列組合:
19
• 在 for Comprehension 兩旁放上(),這
樣的話就會建立一個 generator 物件,具
有惰性求值特性
– sum([n for n in range(1, 10001)])
– sum(n for n in range(1, 10001))
– g = (n for n in range(1, 10001))
20
• 也可以用來建立 set
• 建立 dict 實例
21
• 建立 tuple
• 將 for Comprehension 產生器運算式傳
給 tuple()。
22
使用 def 定義函式
• 發現到程式中…
• 定義函式
• 原先的程式片段就可以修改為:
23
• 函式是一種抽象,對流程的抽象
• 函式也可以呼叫自身,這稱之為遞迴
(Recursion)
24
• 區域函式(Local function)
25
參數與引數
• 不支援函式重載(Overload)
26
• 在 Python 中可以使用預設引數來有限度地
模仿函式重載
27
• 在執行到 def 時,就會依定義建立了相關
的資源
28
• 可以將 prepend() 的 lt 參數預設值設為
None,並在函式中指定真正的預設值
29
• 可以指定參數名稱來設定其引數值,稱之
為關鍵字引數
30
• *與**
31
32
• 可以在一個函式中,同時使用*與**
• 如果想要設計一個函式接受任意引數,就
可以加以運用
33
一級函式的運用
• 函式不單只是個定義,還是個值,是
function 的實例
34
• 函式跟數值、list、set、dict、tuple
等一樣,都被 Python 視為一級公民來對待
• 可以自由地在變數、函式呼叫時指定,也
被稱一級函式(First-class function)
• 函式代表著某個可重用流程的封裝,這表
示可以將某個可重用流程進行傳遞
35
• 過濾出字串長度大於 6 的元素:
• 可能會多次進行這類的比較,因此定義出
函式,以重用這個流程:
36
37
38
• 想將元素全部轉為大寫後傳回新的清單
39
• Python 就內建有 filter()、map() 函式
可以直接取用
• 傳回的實例並不是 list,分別是 map 與
filter 物件
40
• 有時會想將其中的元素進行排序
• sorted()會傳回新的 list,其中包含了
排序後的結果
• key 參數可用來指定針對什麼特性來迭代
41
• 如果是可變動的 list,本身也有個 sort()
方法,這個方法會直接在 list 本身排序
42
lambda 運算式
• 本體很簡單,只有一句簡單的運算,對於
這類情況,可以考慮使用 lambda 運算式
43
• 若需要兩個以上的參數,中間要使用逗號
「,」區隔
• 結合 dict 與 lambda 來模擬 switch
44
初探變數範圍
• 一個名稱在指定值時,就可以成為變數,
並建立起自己的作用範圍(Scope)
• 在取用一個變數時,會看看目前範圍中是
否有指定的變數名稱,若無則向外尋找
45
• 如果在 func() 中,對名稱 x 作了指定值
的動作呢?
46
• 變數可以在內建、全域、外包函式、區域
函式中尋找或建立
47
• Python 中的全域,實際上是以模組檔案為
• builtins 中的名稱範圍,橫跨各個模組
48
• locals() 函式可用來查詢區域變數名稱
與值。
49
• global() 可以取得全域變數的名稱與值
• 如果對變數指定值時,希望是針對全域範
圍的話,可以使用 global 宣告
50
• 來看看以下這個會發生什麼事情?
51
• 在 Python 3 中新增了nonlocal,可以指
明變數並非區域變數
52
yield 產生器
• 函式並不會因為 yield 而結束,只是將流
程控制權讓給函式的呼叫者
53
• 當函式中使用 yield 指定一個值時,呼叫
該函式會傳回一個 generator 物件
• 該物件具有 __next__()方法,通常會使
用 next() 函式呼叫
• 若無法產生下一個值,則會發生
StopIteration 例外
54
• 可以透過 send() 方法指定值,令其成為
yield 運算結果
55
初探型態提示
• Python 3.5 開始,正式納入了型態提示
(Type Hints)特性
• Python 3.6 更進一步加強了這個特性,並
將 typing 模組納入標準 API
56
• 型態錯誤在執行時期才會呈現出來
• 以 add(1, '2') 呼叫函式,執行時就會
發生 TypeError 錯誤
57
• 編輯上的輔助可能不足
58
• 如果需要調整程式庫之間的呼叫協定變更,
會造成程式庫的客戶端必須進行對應的修
改,問題在於哪些地方需要修改呢?
• 要確認每個被影響到的地方,在執行時期
都能執行到,這必須有覆蓋率高的測試流
程才有可能。
• 你的應用程式在開發時真的會寫測試嗎?
測試的覆蓋率又真的足夠嗎?
59
型態提示語法
• 想令其參數只接受整數型態,並且傳回整
數型態:
• 不宣告傳回值型態:
60
61
• 為底下的 names 變數標註 list:
• typing 模組..
62
• 不定長度引數
63
• ** 定義之參數
64
• 如果是個可迭代的物件,例如產生器,可
以使用 Iterator:
• 更精確定義
65
66
使用 mypy 檢查型態
• 除了使用 IDE 之外,社群中推薦的型態檢
查工具之一是 mypy
• 可以透過 pip 來安裝
• 從Python 3.4 開始就內建了 pip 指令
67
68
• 使用 mypy 進行型態檢查
69
70
71

More Related Content

What's hot

5. 建構式、原型與類別
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別Justin Lin
 
從模組到類別
從模組到類別從模組到類別
從模組到類別Justin Lin
 
流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式Justin Lin
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別Justin Lin
 
4. 使用物件
4. 使用物件4. 使用物件
4. 使用物件Justin Lin
 
從 REPL 到 IDE
從 REPL 到 IDE從 REPL 到 IDE
從 REPL 到 IDEJustin Lin
 
12, string
12, string12, string
12, stringted-xu
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Justin Lin
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanupted-xu
 
並行與平行
並行與平行並行與平行
並行與平行Justin Lin
 
11. DOM、事件與樣式
11. DOM、事件與樣式11. DOM、事件與樣式
11. DOM、事件與樣式Justin Lin
 
Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. meta-programming
9. meta-programming9. meta-programming
9. meta-programmingJustin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
7. 錯誤處理
7. 錯誤處理7. 錯誤處理
7. 錯誤處理Justin Lin
 
Scala再探
Scala再探Scala再探
Scala再探afeihehe
 

What's hot (20)

5. 建構式、原型與類別
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別
 
從模組到類別
從模組到類別從模組到類別
從模組到類別
 
流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式
 
進階主題
進階主題進階主題
進階主題
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別
 
例外處理
例外處理例外處理
例外處理
 
4. 使用物件
4. 使用物件4. 使用物件
4. 使用物件
 
從 REPL 到 IDE
從 REPL 到 IDE從 REPL 到 IDE
從 REPL 到 IDE
 
物件封裝
物件封裝物件封裝
物件封裝
 
12, string
12, string12, string
12, string
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
並行與平行
並行與平行並行與平行
並行與平行
 
11. DOM、事件與樣式
11. DOM、事件與樣式11. DOM、事件與樣式
11. DOM、事件與樣式
 
Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件Java SE 8 技術手冊第 4 章 - 認識物件
Java SE 8 技術手冊第 4 章 - 認識物件
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. meta-programming
9. meta-programming9. meta-programming
9. meta-programming
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
7. 錯誤處理
7. 錯誤處理7. 錯誤處理
7. 錯誤處理
 
Scala再探
Scala再探Scala再探
Scala再探
 

Similar to 流程語法與函式

Python程式精修
Python程式精修Python程式精修
Python程式精修ITtraining
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用Robert Hao
 
Python 脚本入门基础
Python 脚本入门基础Python 脚本入门基础
Python 脚本入门基础wklken
 
Refactoring with Patterns in PHP
Refactoring with Patterns in PHPRefactoring with Patterns in PHP
Refactoring with Patterns in PHPJace Ju
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdfczzz1
 
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Justin Lin
 
3. java basics
3. java basics3. java basics
3. java basicsnetdbncku
 
Java SE 8 技術手冊第 15 章 - 通用API
Java SE 8 技術手冊第 15 章 - 通用APIJava SE 8 技術手冊第 15 章 - 通用API
Java SE 8 技術手冊第 15 章 - 通用APIJustin Lin
 
3.型態與運算子
3.型態與運算子3.型態與運算子
3.型態與運算子Justin Lin
 
02.python基础
02.python基础02.python基础
02.python基础modou li
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJustin Lin
 
Ecmascript
EcmascriptEcmascript
Ecmascriptjay li
 
flagboot learning framework technology sharing
flagboot learning framework technology sharingflagboot learning framework technology sharing
flagboot learning framework technology sharingxastraxastra
 
Java SE 7 技術手冊投影片第 12 章 - 通用API
Java SE 7 技術手冊投影片第 12 章  - 通用APIJava SE 7 技術手冊投影片第 12 章  - 通用API
Java SE 7 技術手冊投影片第 12 章 - 通用APIJustin Lin
 
TQC+ 程式語言 Python 04:進階控制流程
TQC+ 程式語言 Python 04:進階控制流程TQC+ 程式語言 Python 04:進階控制流程
TQC+ 程式語言 Python 04:進階控制流程neochen2701
 
Java SE 7 技術手冊投影片第 03 章 - 基礎語法
Java SE 7 技術手冊投影片第 03 章 - 基礎語法Java SE 7 技術手冊投影片第 03 章 - 基礎語法
Java SE 7 技術手冊投影片第 03 章 - 基礎語法Justin Lin
 
揭开Javascript的面纱
揭开Javascript的面纱揭开Javascript的面纱
揭开Javascript的面纱qiang
 
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註Justin Lin
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘Liu Allen
 

Similar to 流程語法與函式 (20)

Python程式精修
Python程式精修Python程式精修
Python程式精修
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用
 
Python 脚本入门基础
Python 脚本入门基础Python 脚本入门基础
Python 脚本入门基础
 
Refactoring with Patterns in PHP
Refactoring with Patterns in PHPRefactoring with Patterns in PHP
Refactoring with Patterns in PHP
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
 
3. java basics
3. java basics3. java basics
3. java basics
 
Java SE 8 技術手冊第 15 章 - 通用API
Java SE 8 技術手冊第 15 章 - 通用APIJava SE 8 技術手冊第 15 章 - 通用API
Java SE 8 技術手冊第 15 章 - 通用API
 
3.型態與運算子
3.型態與運算子3.型態與運算子
3.型態與運算子
 
02.python基础
02.python基础02.python基础
02.python基础
 
Python 2-基本語法
Python 2-基本語法Python 2-基本語法
Python 2-基本語法
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
 
Ecmascript
EcmascriptEcmascript
Ecmascript
 
flagboot learning framework technology sharing
flagboot learning framework technology sharingflagboot learning framework technology sharing
flagboot learning framework technology sharing
 
Java SE 7 技術手冊投影片第 12 章 - 通用API
Java SE 7 技術手冊投影片第 12 章  - 通用APIJava SE 7 技術手冊投影片第 12 章  - 通用API
Java SE 7 技術手冊投影片第 12 章 - 通用API
 
TQC+ 程式語言 Python 04:進階控制流程
TQC+ 程式語言 Python 04:進階控制流程TQC+ 程式語言 Python 04:進階控制流程
TQC+ 程式語言 Python 04:進階控制流程
 
Java SE 7 技術手冊投影片第 03 章 - 基礎語法
Java SE 7 技術手冊投影片第 03 章 - 基礎語法Java SE 7 技術手冊投影片第 03 章 - 基礎語法
Java SE 7 技術手冊投影片第 03 章 - 基礎語法
 
揭开Javascript的面纱
揭开Javascript的面纱揭开Javascript的面纱
揭开Javascript的面纱
 
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
 

More from Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組Justin Lin
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承Justin Lin
 

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承
 

流程語法與函式