翻譯:《實用的Python編程》InstructorNotes


實用的 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM