翻譯:《實用的Python程式設計》InstructorNotes

codists發表於2021-04-24

實用的 Python 程式設計——講師說明

作者:戴維·比茲利(David Beazley)

概述

對於如何使用我的課程“實用的 Python 程式設計”進行教學的問題,本文件提供一些通用的說明和建議,包括課程目標、課程受眾、棘手的內容等。

一些人會在一個典型的、為期三天的公司培訓中進行教學,本說明就是提供給這些教學人員的。在如何教授自己的課程方面,這些說明可能會給你帶來一些啟發。

目標受眾和一般方法

本課程旨在作為已經有一定的程式設計經驗人員的“Python 入門”課程。這絕對不是一門為程式設計新手而設計的課程。

話雖如此,我發現 Python 課程中的學生也不大可能是硬核軟體工程師或者程式設計師。相反,你可能會遇到工程師,科學家, web 程式設計師以及經驗不足的開發者。學生背景差異很大。有些學生可能具有豐富的 C,C++, Java 經驗,有些學生可能瞭解 PHP 和 HTML,有些學生可能掌握的是諸如 MATLAB 這樣的工具,儘管我已經盡了最大努力把課程的先決條件說清楚,但是有些學生可能仍然幾乎沒有傳統的"程式設計"經驗。

考慮到這一點,本課程旨在通過運算元據(尤其是股市資料)的一般問題來教 Python。之所以選擇這個領域是因為它很簡單,並且無論每個人的背景如何,都應該對此有所瞭解。舉個例子,程式設計能力很較弱的學生仍然可能要了解一些常用的東西,例如使用電子表格(Excel)。所以,如果他們真的被卡住了,你可以像這樣告訴他們“元組的就像電子表格裡面的資料行”或者“列表的操作和電子表格的列進行操作並且把結果放到新的一列中類似。”關鍵思想是紮根於現實世界環境中,而不是偏離到深奧的“電腦科學”問題上(例如:計算斐波那契數列)。

這個領域的問題也可以很好的引入其它程式設計主題。例如,科學家/工程師可能想了解資料分析或者資料視覺化,所以你可以給他們展示如果使用 matplotlib 繪圖。Web 程式設計師可能想要了解如何在網頁展示股市資料,所以,你可以討論模板引擎。系統管理員可能想使用日誌檔案做一些事情,所以,你可以引導他們檢視實時的股票資料流日誌檔案。軟體工程師可能想了解設計,所以,你可以讓他們看看將股票資料封裝到物件內部或者使程式可擴充套件的方法(例如,如何讓程式以 10 種不同的表格形式產生輸出)。你懂的。

演示指南

演示幻燈片(notes)為課程提供了敘述結構,供學生練習時參考。加入學生能夠閱讀那些幻燈片並且他們寫程式碼時有時間回頭檢視,那麼就沒必要一字不落的講解。我傾向於快速地瀏覽幻燈片,並在前進的過程中展示一些簡短的例子。我經常跳過這些幻燈片,進行現場演示。例如,你真的不需要那麼多關於列表(list)的幻燈片,而是走向直譯器,現場執行一些列表示例即可。經驗法則:每張幻燈片的時間不超過 1 分鐘,除非是特別棘手的內容。老實說,如果你覺得適合自己的話,可以跳過大部分的幻燈片,而只使用實時演示講課。我經常這樣做。

課程練習

本課程大約有 130 個動手練習。如果你進行每一項練習,並讓學生有時間思考和寫程式碼,則可能需要大約 10-12 小時。在實踐中,你可能會發現學生在某些練習中需要更多的時間。對此,我在下面有一些說明。

你應該向學生反覆強調,題解程式碼是可用的,並且檢視和複製題解程式碼也是可以的——尤其是有時間限制的時候。

在教授課程之前,我強烈建議你瀏覽並完成每一道練習,以免發生意外。

在授課期間,當學生做練習的時候,我通常也在自己的電腦上從頭開始不看答案地完成每一道練習。為此,我強烈建議你手頭準備一份練習的列印副本,而不必在電腦上檢視練習(電腦螢幕那時可能正在投影)。在練習時間快要結束時,我將會開始討論我的題解程式碼,強調螢幕上的不同點並對此進行討論。如果題解存在任何潛在問題(包括設計注意事項),我也將進行討論。請向學生強調,在繼續之前,他們可能要看看或者複製題解程式碼。

第 1 節: 簡介

本節的主要目標是讓學生從程式設計環境開始入手。包括使用互動式shell,編輯或者執行簡短的程式。在本節結束時,學生應該能夠編寫用於讀取資料檔案並執行簡單的計算的簡短指令碼。他們將會了解數字,字串,列表和檔案,也會了解函式,異常和模組,但是不會介紹得太詳細。

本節往往所耗費的時間是最長的,因為學生對工具不熟悉,可能會遇到各種問題。你應該在教室到處走走並且確保每個人可以編輯,執行和除錯簡單的程式碼,這是至關重要的。確保學生正確安裝了 Python,下載了課程練習,網路正常執行。解決出現的任何其他問題。

時間:我打算在第 1 天的中午結束第 1 節。

第 2 節:處理資料

在這門課程中,本節可能是最重要的。它覆蓋了資料表示和操作的基礎,包括元組,列表,字典和集合。

2.2 節是重中之重,請在合理的情況下,給學生足夠的時間讓他們完成練習。這些練習可能會持續 45 分鐘,具體取決於學生。在本練習的中間,我往往會前進到 2.3 節(格式化輸出),給學生足夠多的時間來繼續做練習。綜上所述,2.2 或 2.3 可能需要 1 個小時以上的時間。

2.4 節讓學生探索 enumerate() 和 zip() 函式的用法。我認為這兩個函式是必不可少的,所以,請不要跳過它們。

2.5 節介紹 collections 模組。關於 collections,大量的內容可以說,但這個時候,學生可能還不完全能領會其重要性。不要停留在“collections 是一個很酷的模組,稍後再看。這僅僅是一些示例”的觀點中,而要詳細瞭解collections。

2.6 節介紹列表推導式,這是一個用於處理列表資料的重要特性。向學生強調列表推導式與 SQL 資料庫查詢非常相似。在練習結束時,我經常做一些涉及更高階內容的互動性示例,如寫一個列表推導式,或者使用 matplotlib 將資料視覺化。如果你願意,這也是一個介紹 Jupyter 的機會。

2.7 節是最複雜的練習。它涉及到在 Python 中一級資料的使用,以及事實——諸如列表之類的資料結構可以儲存任何型別物件,只要你想。這些練習與解析 CSV 中的資料列相關,稍後在 3.2 節中會再次使用相關的概念。

時間:理想情況下,你希望第一天就完成第 2 節。但是,通常以第 2.5 節或者第 2.6 節結束。因此,如果你覺得自己有寫落後,也不要驚慌。

第 3 節:程式組織

本節的主要目標是介紹有關函式的更相信的資訊,並且鼓勵學生使用函式。本節將函式構建到模組和指令碼編寫中。

3.1 節是關於如何將簡單的“指令碼”轉變為函式。不要鼓勵學生寫亂七八糟的“指令碼”,相反,程式碼至少應該模組化到函式中。這使程式碼更易於理解,更易於後續變更,執行更快。函式很好。

在整個課程中,3.2 節可能是最高階的一組練習。本節練習中,學生需要編寫一個通用的實用函式來解析面向列的資料。但是,這會大量使用列表推導式和函式(例如,作為一等物件的函式)。你可能需要指導學生完成此程式碼的每一個步驟,詳細地展示它的工作原理。然而,這樣做的回報是巨大的——你可以向學生展示一個簡短的通用函式,該函式的功能非常強大。如果沒有大量複雜的程式碼,這些功能用C、C++ 或 Java 幾乎是不可能寫出來的。對於這些程式碼,有很多可能的設計或者討論途徑。發揮你的想象力吧。

3.3 節為在 3.2 節中建立的函式新增了錯誤處理。通常,這是一個討論異常處理的好時機。一定要談一談捕獲所有異常的危險性。這可能是談論“Python 之禪”裡面“錯誤絕不能悄悄忽略”原則的好時機。

注意事項:在練習 3.4 之前,確保學生獲得了完全可以用的 report.py,pcost.py 和 fileparse.py。如果需要,請從 Solution 目錄複製。

3.4 節介紹模組匯入。3.2-3.3 節編寫的檔案用於簡化 3.1 節的程式碼。請注意,你可能需要幫助學生解決 IDLE,sys.path 以及其它與匯入有關的各種設定的問題。

3.5 節討論 __main__ 和指令碼編寫。有一點內容是關於命令列引數的。您可能會傾向於討論類似 argparse 這樣的模組。但是請注意,這樣做會“開啟一個泥潭”(譯註:opens up a quagmire,可理解為“引入新的問題”),一般情況下,最好只提一下然後繼續。

3.6 節對 Python 中的設計展開討論。編寫靈活的程式碼好還是編寫硬編碼檔名的程式碼好?這是你修改程式碼並必須對已有程式碼進行重構的第一個地方。

從這裡開始,大部分的練習都是對已經寫好的程式碼做一些小改動。

第 4 節:類和物件

本節是關於物件導向程式設計(OOP)的。一般來說,假定學生在物件導向(OO)方面有深厚的背景是不保險的。因此,在開始之前,我通常會對物件導向程式設計“風格”以及資料和方法是如何繫結在一起的進行描述。以字串和列表為例,說明什麼是“物件”以及物件是如何呼叫(通過 . 號呼叫)方法進行操作的。強調方法是如何繫結到物件本身的。例如,使用 items.append(x) ,而不是呼叫一個單獨的函式 append(items, x)。

4.1 節介紹類語句以及向學生展示如何建立一個基本的物件。實際上,這只是為了介紹:類可以作為定義簡單資料結構的一種方式——可以和第 2 節中為此目的而使用元組和列表聯絡起來。

4.2 節是關於繼承以及如何使用使用繼承建立可擴充套件程式的。就物件導向程式設計和麵向物件設計而言,本組練習可能是最重要的。請給學生足夠的時間(30-45 分鐘)學習繼承。根據興趣,你可以花費大量時間對物件導向程式設計的不同方面進行討論。例如,不同的設計模式,繼承層次結構,抽象基類等。

4.3 節使用特殊方法做了一些試驗。我不會花費太多時間去折騰特殊方法。稍後,練習 6.1 和其它地方會介紹特殊方法。

時間上,通常是第二天結束。

第 5 節:內部物件

本節將向學生介紹物件系統的幕後知識,如何使用字典構建物件系統,例項和類是如何繫結在一起的,繼承是如何工作的。不過,本節最重要的部分可能是封裝(private,attributes,,properties,slots等)。

5.1 節揭開表面現象,讓學生觀察和使用例項和類的底層字典。

5.2 節討論在 get/set 函式背後隱藏屬性(attribute)並使用特徵屬性(properties)。我通常強調,這些技術在庫和框架中很常用——尤其是需要對使用者的選擇進行控制的時候。

精通 Python 的高手會發現我根本沒有討論像描述器(descriptors)或屬性訪問方法(__getattr__
__setattr__)這樣的高階主題。根據以往的經驗,我發現,這樣做對於參加入門課程的學生而言,精神負擔太重了。此時,每個人的頭腦已經處於爆炸的邊緣,如果現在去討論描述器的工作原理,那麼,要麼在今天餘下的時間裡,要麼在這門課程剩下的時間裡,你會失去他們。將這些高階主題放到“高階 Python”課程吧。

如果你正在看著時鐘想著“我講不完這門課程了”,那麼你完全可以跳過第 5 節。

第 6 節:生成器

本節的主要目的是介紹生成器,生成器可用於實現自定義迭代。並將其用於與資料處理相關的各種問題。本節練習讓學生學會分析流資料。練習使用被寫入日誌檔案的股票更新資訊作為流資料。

在本節中,有兩大觀點需要強調一下。第一個觀點,可以使用生成器編寫基於增量處理(incremental processing)的程式碼。這對於流資料或其它龐大的資料集非常有用,因為這些資料太大了,無法一次性全部放入記憶體中。第二個觀點,你可以將生成器/迭代器連結在一起使用以建立處理管道(類似於 Unix 的 pipes)。同樣,這是處理和思考流資料,大型資料集的非常強大的方法。

省略的內容:儘管本節描述了迭代協議,但是並沒有詳細介紹如何建立可迭代物件(即帶有 __iter__()next() 方法的類)。在實踐中,我發現沒必要總是介紹如何建立可迭代物件(生成器通常更好/更簡單)。所以,為了節省時間,我特意將其省略。也不包括擴充套件生成器(協程)和併發生成器(如微執行緒 tasklets)。在高階課程中,最好包含這些內容。

第 7 節:高階主題

本節基本上是各種高階主題。這些主題本可以在之前進行介紹,但是由於與課程流程和課程練習內容相關的各種原因而沒有介紹。如果你一定要知道的話,我曾經在課程的前面介紹過這些內容。因為學生已經被充足的資訊所困擾,所以稍後再討論這些高階主題更好一些——特別是到目前為止,每個人對 Python 都更加熟悉並且開始掌握使用 Python 的竅門。

高階主題包括可變引數(*args, **kwargs),匿名函式(lambda),閉包(closures)以及裝飾器(decorators)。對裝飾器的討論只是超程式設計(metaprogramming)的一小部分。對此,你可以暢所欲言,但是我可能會避開元類(metaclasses)。最近,我一直在演示“numba”,將其作為更有趣的裝飾器的例子。

如果時間緊迫,第 7 節的大部分內容可以跳過或者高度濃縮(例如跳過練習)。

第 8 節:測試和除錯

本節主要目的是介紹各種與測試、除錯、以及軟體開發相關的工具和技術。向學生介紹單元測試模組(unittest)、日誌模組(logging),討論斷言(assertions)和"契約(contract)程式設計的思想",展示偵錯程式(debugger)和分析器(profiler)。這其中的大部分內容是不言自明的。

第 9 節:包

現在,學生已經編寫了各種檔案(pcost.py,report.py,fileparse.py,tableformat.py,stock.py,portfolio.py,follow.py......)。本節主要有兩個目標:第一個,將所有的程式碼放入 Python 包結構中,雖然這只是簡單的介紹,但是它們會將檔案移到一個目錄中,並且所有的內容將會被破壞,所以需要對匯入語句(與包相關的匯入)進行修改,並且可能需要弄一個 __init__.py 檔案。第二個,編寫一個簡單的 setup.py 檔案用於打包程式碼並分發給其他人。就這些,本課程到此結束。

目錄

注:完整翻譯見 https://github.com/codists/practical-python-zh

相關文章