Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

流程語法與函式

182 visualizaciones

Publicado el

認識基本流程語法
使用 for Comprehension
認識函式與變數範圍
運用一級函式特性
使用 yield 建立產生器
初探型態提示

Publicado en: Tecnología
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

流程語法與函式

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

×