那门用Python讲授的程序设计课程能带给学生什么?

那门用Python讲授的程序设计课程能带给学生什么?

海洋饼干叔叔 @ 重庆大学

最近这几年,Python火上天了。历史上,即便是Python它菩提老祖C语言(Python解释器是用C语言写的),也从未那么火过,毕竟在C语言刚出来那个年代,计算机只有很有钱的人家(比尔盖茨他妈是IBM董事,社会活动家)才有,编程还是少数技术人员拥有的特殊技能。

Python火起来的最大原因是所谓人生苦短,我用Python。易学易用的特点使得编程不再是需要专业训练的特殊技能,下至高校教师,家里的小祖宗,上至家里管钱管厨房的领导,进行引力波探测的顶尖科学家,都可以使用Python来编程。什么?不信?我们选择一个特别的角度证明给你看:下面是各种牛掰语言的爹地合集, 包括C++他爸Bjarne Stroustrup, Java之父James Gosling,PHP他爹Rasmus Lerdorf, Go语言之父Rob Pike, 以及造就Python的伟大“河(去声)南“ 雷峰 - Guido van Rossum。猜猜这几张照片哪位是Python之父Guido van Rossum ?

languagefather

答案就是: 头发最茂盛那位!

工业界为之疯狂,阿里https://edu.aliyun.com/course/505
微软https://www.bilibili.com/video/av69042526/
谷歌https://developers.google.com/edu/python/

都推出了自己的专属Python课程,急吼吼地想培训和吸引P8以上的有福报能加班的年轻人。好像不免费提供一点像样的Python课程,都不好意思说自己是负责任的国际大公司。

中国的教育界也疯了,先是浙江传出消息,管教育那帮人终于睡醒了,从高中课标里删除了老掉牙,没人用的Visual Basic, 用Python替代,顺带着把Excel, Access也踢出了课标,因为Excel, Access能干的活好像Python也能干。

然后,山东,上海,北京,重庆相继表示,我们也不能落后,除了往中学课标里加入Python内容外,还顺带把”先进的科学”直接送到“我们的祖国是花园”,小学六年级的《信息技术-Python入门》给大家感受一下。

看这架势,Python进入高考已是板上钉钉,以后的泱泱中华,要想再找出一个没学过编程的小朋友,真如大海捞针一般困难。

中小学都上了, 大学自然也要上。无论是中国还是美国,Python正取代C/C++语言,成为大学最受欢迎的编程入门课程。大学里讲编程基础课的老师好像也松了一口气, 终于不会因为C语言劝退诸多懵懵懂懂的小朋友了。要知道,C语言以”从入门到放弃“而闻名而世,特别当你选用早期的C语言书作为教材的时候。在那个年代,学习编程的大多是一些智商超群的人,所以彼时的作者高估了读者的智商,专门挑一些没什么大用处,然后又特别烧脑的断头路(比如i = i++ + ++i,i之前等于0,问之后等于几?),死路,带着萌新们一条道走到黑,,,成功降低了程序员市场的竞争烈度。这么说其实对当时的作者也不太公平,老先生的书,在当年已经算是很浅显的了,在向社会普及计算机及编程知识方面,功勋卓著。

所谓内行看门道,给大一,大二的小鲜肉们上菜,不能太马虎。上一门借Python之名的程序设计课程,显然不能只讲语法,那是舍本逐末之举。作者在某985大学教了15年编程(从C, C++一直教到Python),又同时在工业界当了15年程序员,还跨圈画了数年的电路图,还曾经对着三视图跟模具工程师、结构工程师讨论过公差配合,运动噪声消除,材料耐用性之类的“高深”问题,,,,, 大着胆子,分享一下一家之言:

Python程序设计课应该带给学生什么?

1. 算法 - 用计算机解决问题的思维习惯

乔帮主(布斯)留下话:学习编程教你如何思考。孔夫子也说过,学而不思则罔。所以不管学生的层次(985,211,三本,专科, 高职)如何,一定要在课程里带点算法以及使用算法解决问题的例子给他。包括但不限于下述示例,它们都是用Python写的,大部分都是带图,带动画的。(如果一直print, 老师学生都会疲倦)

image-20200901131459806

image-20200901132308262

image-20200901132840616

assets

发现圆周率 - 使用投点方法,借助于均匀分布的随机数函数,重新估算圆周率

image-20200901133204510

一对兔兔与函数的增长 - 讲述著名的斐波那契数列, 以及函数的递归调用, 嗯,再帮助学生回顾一下《高等数学》中无穷大的阶的不同在计算机里如何体现,我们把斐波那契数列与n2, n3函数进行了作图比较,观察函数的增长速度

汉诺塔 - 递归求解的经典案例,古老的印度智慧

文本进度条 - 旧科技时代的回望

2. 语言 - 简单实用的语法

变量与数据类型、缩进、输入输出、条件分支、列表、名字绑定、循环、字典、函数抽象、文件的读写、高级的字符串处理这些都是必不可少的语言知识。但笔者认为,面向对象也是一种思维方式和设计哲学,不可或缺。所以,在程序设计课程里应该有面向对象的一席之地。

除此之外,异常处理、单元测试、类序列化、迭代器与生成器等则属于非必要的语法知识,其讲授可根据学生的层次,以及学习目标而定。

对于C/C++这类复杂的语言,即便是一个熟练的程序员,也大概只会使用到其中20%的特性,另外80%则几乎不用。对Python而言,情况好一些,在选择课程内容时,应该挑出那些实用的,常用的语法特性加以认真发挥,而对于那些生僻的,生僻且晦涩难懂的,不讨论为妙。

但是,对于那些重要的特性,比如range(), 比如切片语法,则一定要讨论清楚。作者相信:图比文字清楚,所以画很多的流程图来帮助解释数值列表与切片及其他关键的语法:

image-20200829110105976

总之, 语法的介绍要从实用出发, 而不是“考试”出发,象 i++++ 这种类型的“劝退”语法,坚决不涉及。

3. 代码 - 优美的编程习惯示范

好的代码应该读起来跟散文一样优美。所以教材中给学生的示例代码大部分长这样:有行号,字体优美,匈牙利命名法则,连字体也精心选择的。

image-20200826163102254

我们相信,学生会模仿老师的代码。老师的代码如果质量高,学生会潜移默化地学到优美,良好的编码风格和习惯。在书里面,我们还经常提及断言、单一职责原则、单元测试等简单的软件工程原则,希望在教授表面语法同时,顺便传递一点“内功”。

4. 实践 - 与专业相结合

我一个学新闻的,为什么要学编程?

我们法学院,开个毛线编程课!

我只想静静地做个医生,不行么?

隔壁数理学院,开编程课,为什么我们学土木的也要开?

这是非计算机专业的学生在学习编程时的常见抱怨。 原因有二:

a. 课程内容与实践脱节,为教而教,为考试而学,学完就忘;

b. 课程里的案例与学生的专业没有关系,学生没有获得用编程方法解决本专业问题的体验。

为了解决这个问题,我们设计了很多示例,涉及数学、美术、文学、历史、信号处理、医学、经济学、游戏、科学计算、人工智能等众多学科门类和领域。众多不同专业的学习者,都可以在本书中找到与本专业相关的应用实例。放几个大家感受一下。这些示例,有难有易。事实上,考虑到部分示例的复杂性,我们并不指望大一年级的新生能够完全读懂,我们只是希望让明白,学好编程,对他的专业发展颇有助益。

image-20200829102852210

image-20200829103638886

image-20200829105851492

一棵树的建造 - 树形数据结构、递归、分形、树的宽度优先遍历算法

汉诺塔 - 定时器、pygame框架、汉诺塔算法、计算复杂性分析、复杂程序的结构、生成器

bubblesort

GDP前15工业图家的冒泡排序演示 - 多线程、GUI程序设计、PyQt、分时图形界面程序框架

图像风格迁移 - 深度学习、神经网络

raindrops

缙湖下雨啦 - matplotlib动画、numpy多维数组

mandelbrot

Mandelbrot集合 - 分形数学的开山之作

1545886138454

对ECG信号进行数字滤波

shownetwork

唐全诗数据分析 - 关系数据库、字典、数据分析

5. 手把手的私教学习体验

新形态"电纸"书,凡是涉及实践操作的每一步,都有视频/图文步骤指导,扫扫二维码,轻松可得。

全书提供数百个二维码,提供在线课堂、先睹为快、操作指导、扩展阅读等各种在线协助。为读者的编程学习提供手把手"私教"。

image-20200826173250510

6. 配套火爆B站的在线MOOC,学习轻松不怕难

a1 image-20200826173550527

写到了这一步,我的小心机藏不住了,对,我就是向读者推荐优质Python入门教材的,它长这样,某东、某宝、某当有售。

《Python编程基础及应用》

a2

image-20200826173917291

image-20200826174009696

image-20200826174039780

image-20200826174055496

image-20200826174113042