PracticalPythonProgramming-InstructorNotesBy:DavidBeazley概述了如何使用我的课程“PracticalPythonProgramming”进行教学的问题,该文档提供了一些一般性的说明和建议,包括课程目标、课程受众、棘手的内容等。本说明适用于那些将在典型的为期三天的公司培训中任教的人员。这些说明可能会给您一些关于如何教授自己的课程的启发。目标受众和一般方法本课程旨在为已经具有一定编程经验的人员提供“Python入门”课程。这绝对不是为编程新手设计的课程。话虽如此,我发现Python课程的学生也不太可能成为核心软件工程师或程序员。相反,您可能会遇到工程师、科学家、网络程序员和经验不足的开发人员。学生背景差异很大。有些学生可能有丰富的C、C++、Java经验,有些学生可能知道PHP和HTML,有些学生可能有MATLAB等工具,虽然我已经尽力把课程的先决条件讲清楚了,但有些学生可能仍然很少甚至没有传统的“编程”经验。考虑到这一点,本课程旨在通过处理数据(尤其是股票市场数据)的一般问题来教授Python。选择这个领域是因为它很简单,而且无论背景如何,每个人都应该知道。例如,一个编程水平很低的学生可能仍然需要知道一些常用的东西,比如使用电子表格(Excel)。所以,如果他们真的卡住了,你可以告诉他们一些类似“元组就像电子表格行”或“列表操作对电子表格列进行操作并将结果放在新列中类似......”的关键思想植根于现实世界的背景,而不是转向深奥的“计算机科学”问题(例如计算斐波那契数列)。该领域的问题也是对其他编程主题的良好介绍。例如,科学家/工程师可能想了解数据分析或数据可视化,所以你可以向他们展示如何使用matplotlib绘图。Web程序员可能想学习如何在网页上显示股市数据,所以你可以谈论模板引擎。系统管理员可能想用日志做一些事情文件,因此您可以引导他们查看实时股票数据流日志文件。软件工程师可能想了解设计,因此您可以向他们展示将库存数据封装在对象中或使程序可扩展的方法(例如,如何使程序以10种不同的表格形式生成输出)。你知道。演示指南演示幻灯片(注释)提供了课程的叙述结构,供学生在练习时使用。补充一点,学生可以阅读那些幻灯片,他们在编写代码时有时间回顾,因此不需要逐字解释。我倾向于快速浏览幻灯片,并在浏览过程中展示简短的示例。我经常跳过这些幻灯片并进行现场演示。例如,您实际上并不需要那么多关于列表的幻灯片,而是走到讲解员那里并现场做一些列表示例。经验法则:每张幻灯片不超过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节介绍了集合模块。关于收藏可以说的很多,但是此时同学们可能还没有完全理解它的重要性。不要陷入“集合是一个很酷的模块,稍后再见。这些只是一些示例”的观点,了解有关集合的更多信息。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。如果需要,从解决方案目录复制。第3.4节介绍了模块导入。3.2-3.3节中编写的文件用于简化3.1节中的代码。请注意,您可能需要帮助学生处理IDLE、sys.path以及与导入相关的各种其他设置。第3.5节讨论了__main__和脚本。有一些关于命令行参数的内容。您可能想讨论像argparse这样的模块。但请注意,这样做会“开辟泥潭”(译注:开辟泥潭,可以理解为“引入新问题”),一般情况下,最好只提一下,继续前进。3.6节讨论了Python中的设计。编写灵活的代码还是硬编码文件名更好?这是您修改代码并必须重构现有代码的第一个地方。从这里开始,大部分练习包括对已编写的代码进行小的更改。第4节:类和对象本节是关于面向对象编程(OOP)的。一般来说,假设学生具有很强的面向对象(OO)背景是不安全的。所以在开始之前,我通常会描述面向对象的编程“风格”以及数据和方法是如何绑定在一起的。以字符串和列表为例,解释什么是“对象”,以及如何调用对象(通过.calls)来对方法进行操作。强调方法如何绑定到对象本身。例如,使用items.append(x)而不是调用单独的函数append(items,x)。4.1节介绍了类语句并向学生展示了如何创建基本对象。实际上,这只是为了介绍:类可以用作定义简单数据结构的一种方式——这可以链接到第2节中用于此目的的元组和列表的使用。第4.2节是关于继承以及如何使用它来创建可扩展的程序。就面向对象编程和面向对象设计而言,这组练习可能是最重要的。请给学生足够的时间(30-45分钟)来学习继承。根据您的兴趣,您可以花很多时间讨论面向对象编程的不同方面。例如,不同的设计模式、继承层次、抽象基类等。4.3节使用特殊的方法做了一些实验。我不会花太多时间来研究特殊方法。稍后在练习6.1和其他地方介绍了特殊方法。从时间上来说,一般都是第二天结束。第5节:内部对象本节将向学生介绍对象系统的幕后知识,字典如何用于构建对象系统,实例和类如何绑定在一起,以及继承如何工作。不过,这部分最重要的部分可能是封装(私有、属性、属性、插槽等)。第5.1节揭开表面,让学生观察和使用实例和类的基本字典。5.2节讨论了在get/set函数后面隐藏属性和使用属性。我通常会强调这些技术通常用于库和框架中——尤其是在需要控制用户选择时。精通Python的人会注意到,我根本没有讨论描述符或属性访问方法(__getattr__、__setattr__)等高级主题。根据过去的经验,我发现这样做对参加入门课程的学生来说太费脑力了。在这一点上,每个人的思想都处于爆炸的边缘,如果你现在讨论描述符是如何工作的,你将在今天剩下的时间或课程的剩余时间里失去它们。将这些高级主题放在“高级Python”课程中。如果您看着时钟并想“我无法完成这门课程”,那么您可以完全跳过第5部分。第6节:生成器本节的主要目的是介绍生成器,可用于实现自定义迭代。并将其用于与数据处理相关的各种问题。本节中的练习允许学生学习分析流数据。练习使用写入日志文件的股票更新信息作为流数据。在本节中,需要强调两个要点。首先,您可以使用生成器编写基于增量处理的代码。这对于流数据或其他太大而无法一次放入内存的大型数据集很有用。其次,您可以将生成器/迭代器链接在一起以创建处理管道(类似于Unix管道)。同样,这是一种处理和思考流数据、大型数据集的非常强大的方法。遗漏内容:虽然本节介绍了迭代协议,但并未详细介绍如何创建可迭代对象(即具有__iter__()和next()方法的类)。在实践中,我发现没有必要总是涵盖如何创建可迭代对象(生成器通常更好/更简单)。所以,为了节省时间,我特意省略了它。广泛的生成器(协程)和并发生成器(例如tasklet)也被排除在外。在高级课程中,最好包括这些内容。第7节:高级主题这部分基本上是各种高级主题。这些主题本来可以更早地涵盖,但由于与课程流程和课程练习内容相关的各种原因而没有涉及。如果你一定要知道的话,我在课程的前面已经讲过了。因为学生们已经对足够的信息不知所措,所以最好稍后再讨论这些高级主题——尤其是现在每个人都更加熟悉Python并开始掌握使用它的窍门。高级主题包括可变参数(args,*kwargs)、匿名函数(lambda)、闭包和装饰器。装饰器的讨论只是元编程的一小部分。你可以说你想要什么,但我可能会避开元类。最近,我一直在演示“numba”作为更有趣的装饰器的例子。如果时间紧迫,可以跳过或高度压缩第7节的大部分内容(例如跳过练习)。第8节:测试和调试本节的主要目的是介绍与测试、调试和软件开发相关的各种工具和技术。向学生介绍单元测试、日志记录、讨论断言和“合同编程思想”,演示调试器和分析器。其中大部分是不言自明的。第9节:包现在,学生已经编写了各种文件(pcost.py、report.py、fileparse.py、tableformat.py、stock.py、portfolio.py、follow.py...)。本节有两个主要目标:首先,将所有代码放入Python包结构中,虽然这只是一个简单的介绍,但它们会将文件移动到一个目录中,并且所有内容都会被破坏,因此import语句(package-relatedimports)需要修改,可能需要创建一个__init__.py文件。其次,编写一个简单的setup.py文件,用于打包代码并分发给其他人。就这样,课程到此结束。目录注:完整翻译见https://github.com/codists/practical-python-zh
