我正在向本科数学专业教授Python。我对学生应该介绍各种Python概念的最佳顺序感兴趣。在我看来,在每个阶段,学生应该只使用当时可用的工具来解决一个非平凡的编程问题。每个新工具都应该能够为熟悉的问题提供更简单的解决方案。为了让学生专注,必须选择Python中的众多概念。他们也应该激励并且应该欣赏每个新掌握的工具,而不需要太多的记忆。以下是一些具体问题:
欢迎任何有解释的建议。
编辑:在高中时,学生们被介绍到计算机上。其中一些人学会了如何编程。在此之前,他们有一个课程,涵盖word,excel,powerpoint,html,latex,品味Mathematica,但没有编程。 5年前我在本课程中使用了Mathematica,后续课程使用了C和后来的Java。现在我教Python的介绍,在后续课程中,我的同事在Python中教授面向对象的编程。之后,学生可以参加有关数据结构,算法,优化的特殊课程,以及他们自己在Mathematica,Matlab和R上学习的一些选修课程。
答案 0 :(得分:20)
答案 1 :(得分:2)
您可以在此处查看我的大纲:http://homepage.mac.com/s_lott/books/nonprog/html/index.html
此演示文稿顺序基于C,Ada,C ++,PL / SQL(甚至是COBOL课程)的教学经验。
有一本很棒的书,它有一个明智的教学顺序。
R上。 C. Holt,G。S. Graham,E。D. Lazowska,M。A. Scott。结构化并发编程与操作系统应用程序。 1978.艾迪生 - 韦斯利。 0201029375
答案 2 :(得分:2)
e-satisf的清单非常好,但由于这是一个数学课,我会添加以下建议:
首先,要么使用Python 3.x,要么告诉他们始终使用
from __future__ import division
否则,它们将被整数除法咬住。当你在交互式提示符下键入1/2时很容易记住,但是你会在微妙的地方得到错误:
def mean(seq):
"""Return the arithmetic mean of a list."""
return sum(seq) / len(seq)
教授函数时,向它们显示数学模块和内置和函数。还显示了将函数传递给另一个函数的能力,这对于编写泛型导数/积分近似非常有用:
def derivative(f, x, delta_x=1e-8):
"""Approximate f'(x)."""
return (f(x + delta_x) - f(x - delta_x)) / (2 * delta_x)
print(derivative(math.sin, 0))
答案 3 :(得分:1)
这实际上取决于他们知道多少编程,但我已经看到R成功地介绍给完全没有编程知识的人。我猜他们对编程知之甚少。
这可能听起来很明显,但只教授解决问题所需的语言,不要过于深入“正确”和高效的编码风格,一旦学生学习,你就可以慢慢开始学习有一些了解,例如评论风格,但不要太严格。
要解决问题,您必须至少了解该语言的一些基本部分。我将假设您所做的一切可能都包含在一行中,命名空间,模块,性能等确实不是首要任务。
首先使用开发环境设置它们,然后创建一个简单的程序供它们运行。确保他们拥有一个拥有所需内容的环境(如果他们需要numpy,请完成安装),从命令行开始执行程序,当然还有一个易于使用的编辑器(例如Eclipse + PyDev,可能太复杂了)。最令人沮丧的是你无法获得工作环境。祈祷你不必支持窗口或没有很多库来应对。
一旦你有了这个,一般介绍他们的语言。封面类型和可能遇到的微妙问题,例如:
>>> 1/2
0
>>> 1./2
0.5
我甚至会灌输让一切都漂浮的习惯。引入输出字符串以及如何在同一行上输出该输出。覆盖操作和逻辑,然后提供“功能”的介绍,确保创建数学等价物之间的区别。我认为命令流结构应该相当简单,包括简单的(如果,其他,elif,可能还有)。
此时他们应该能够创建一个简单的程序来解决一个简单的问题。开始构建这个,引入更复杂的命令流,更复杂的数据类型(列表,集合,dicts),可能是迭代器和生成器(小心这些,它们可能很痛苦,你可能不需要它们。)
编辑:
我忘了触摸输入和输出。如果你愿意的话,我会为你的学生提供一个简单的框架。命令行应该足够,除非您想要跟踪发生的情况,在这种情况下文件输出更合理。或者,输出到文件的管道输出也可以。
我认为集合在数学上更相关(也很有用!)然后是dicts,并且会先介绍它们。
答案 4 :(得分:1)
我最近为一到三年级的计算机科学专业的学生讲了一个简短的Python速成课程,其中大多数人只知道C和C ++,甚至不太了解。我的方法与你的建议完全不同。
免责声明:我的课程目的是向已经熟悉编程基本概念的人介绍该语言,因此如果您教授从未接触过的人,这可能不合适编程。
int -> float
)list & tuple -> string -> bytearray
)针对您的具体问题:
例如,我的前任在字符串之前引入了列表。我认为相反的是更好的解决方案。
我不同意。从概念上讲,字符串只是一个得到很多特殊处理的列表,所以建立在更简单的列表概念上是有意义的。如果你像我一样从数据结构开始,你也不必处理在I / O示例中无法使用字符串的问题。
是否应该在开始时或在掌握基本的结构化编程思想之后引入函数定义,例如决策(if)和循环(while)?
绝对是。调用函数应该与基本的结构化编程思想大致同时进行,但是应该推迟定义自己的函数。
应该在字典之前引入集合吗?
嗯,字典肯定在实践中使用得更多,但是如果你已经引入了序列,解释集(特别是对数学学生来说)不应该花很长时间,从简单到更复杂的结构进展是有意义的。 / p>
在课程早期引入阅读和写作文件是否更好?或者在课程的大部分时间使用输入和打印是否更好?
Python的IO功能非常简单,所以它并不重要,但我认为这些对于基本练习来说是不必要的,所以你不妨在课程的后半部分让它们离开。
在我看来,在每个阶段,学生应该只使用当时可用的工具来解决一个非平凡的编程问题。每个新工具都应该能够为熟悉的问题提供更简单的解决方案。
增量方法显然与我的学术方法非常不同,但它肯定有其优点,尤其是它让人们更感兴趣。但是,我总是不喜欢这样一个事实:当你完成这种方式学习一门课程时,你会感觉到,除了你迄今为止学到的最简单的问题之外,你可能会有一个更简单的解决方案,因为那里一直都是在课程期间。