本文PPT是董付国老师在“全国青少年STEAM创客教育论坛暨粤东青少年创客文化节”的报告内容。
学习任何程序设计语言,都应结合具体的实际问题,不可空学语法纸上谈兵,更不能把程序设计作为一门孤立的课来讲。作为大学任课教师,可以结合学生专业理论课中的理论、算法或问题来讲Python。
编写程序永远都是最后一步。万不可拿到问题就急急忙忙开始写代码,应该对问题进行深入分析,选择或设计相应的算法并进行足够的优化,最后再写代码实现。
充分利用问题背后的规律或关系,尽最大可能消除重复计算和不必要的计算,是算法优化的核心思想。
有了足够优化的算法之后,还应考虑代码层面的优化,充分发挥和挖掘所用程序设计语言自身的优势和提供的机制,进一步提高效率,降低时间复杂度和空间复杂度。在优化Python程序时,消除循环是提高运行速度的重要方式之一。
内置函数map()、filter()和标准库函数reduce()在底层封装了循环结构,可以大幅度提高效率,函数式编程模式是优先推荐使用。另外,下面的第二段代码使用内置类型int巧妙实现了安全展开式的计算,比列表推导式的等价代码快上百倍。但演示代码中涉及的问题并不是通用的,主要是提供一个思路,遇到具体问题还需要具体分析和优化。
如何利用有限的学时来覆盖、讲授和演示尽可能多的知识点,是老师对相关知识掌握程度和教学设计、课堂掌控能力的综合考验。案例不一定要多,但是一定要“精”,尽量设计或选择能够包含多个语法知识的教学案例。例如,下面的代码中演示了Python关键字else的4种用法。
在开发大型或商用项目时,不应只考虑正常情况下程序的逻辑,还需要花费大量时间和精力来考虑异常情况下的逻辑,保证程序在非正常条件下仍有相对正常的表现。凡需要用户提供输入的场景,都必须要对用户输入进行严格的检查和过滤。下面的代码中,重点关注字符串方法lower()和关键字in的使用,这也是代码优化的一个体现。
在下面的代码中,左上角代码是对组合数定义进行展开并约分后得到的表达式进行计算。右下角代码是对计算组合数的帕斯卡公式的实现,利用Python标准库提供的缓冲机制大幅度消除重复计算来提高上万倍的速度,右上角是对应的二叉树原理。左下角代码演示的Python 3.8之后的标准库math中已经提供了组合数计算函数,可以直接使用。
下面第一段代码中最后的break删除之后运行结果仍是正确的,但是加上这句break的话代码质量立刻有了大幅度提升,说明写代码的人对问题进行了分析,而不是简单地从数学到代码的简单翻译。因为从数学上来讲,鸡兔同笼问题实际上是个二元一次方程组的求解问题,众所周知二元一次方程如果有解的话必然是唯一解。所以在循环中找到一组解之后不需要继续循环,不可能有其他解了。第二段代码是把二元一次方程组的数学求解过程直接翻译成程序了。
技术是个双刃剑,我们在运用技术时,必须严格遵守相关法律法规、计算机伦理学和职业道德,不可凭借技术优势肆意妄为,网络不是法外之地。
下面案例涉及的问题在网络上叫“中国式过马路”,但实际上同样的问题在任何国家任何城市都是存在的,叫“中国式过马路”是对我们的不尊重,所以我在教学中选用这个案例时改成了“集体过马路”,每一个人都应该像爱护自己的家一样去爱护我们的祖国。我们在案例选择时需要消除其中的歧视性因素,必要的时候进行适当修改。