How to teach beginners reversing a string in Python?
我正在给一年级的数学学生讲授"计算机程序设计导论"课程。必须假设这是学生第一次接触计算机编程。以下是我教学的主要目标:
- 学生应该学习和理解Python的基础知识。
- 最终,他们需要掌握足够多的Python工具,以便能够为给定的问题选择正确的工具。
- 同时,他们必须通过计算机编程学习解决问题的基本技能。
我的教学方法是给每个新引入的概念一系列的问题和挑逗,以激励学生。例如,当引入字符串和列表时,一个自然问题是字符串或列表反转的任务。如果我让学生写一个代码来检查一个字符串是否是回文,那么我最好告诉他们如何反转它。
对于列表,自然解决方案myString.reverse()至少有两个缺点:
它不会延续到字符串上。
学生们会发现这是一种魔力,除非先告诉他们方法。
真正的问题是:如何在Python中引入反转字符串的问题?
- 告诉他们使用myString[::-1]有什么困难?
- 请提供您想使用的材料。这是Python中的一个小函数,不需要任何"教学"。它已经在图书馆里了。你想教什么?算法?数据结构?如何在图书馆中搜索?如何避免使用谷歌?请提供您的问题的更多背景。
- 我可以这样做,但他们会理解还是只是学习另一个技巧?
- 我认为步调符号是教Python初学者反转字符串的最简单方法。
- @托马?皮桑斯基:你的目标是什么?你想教他们什么?请提供课程材料的摘要,以便我们了解适合的地方。教"倒弦"有什么意义?
- @洛特:我试着把他们介绍给计算机编程,这样他们就不必记住一些技巧了。我喜欢Python,因为它通常有自然的解决方案。但是,例如,mylist.reverse()和mystring[::-1]之间存在很大的差异。你能告诉我A和B的值应该是多少,才能让我的字符串[A:B:-1]达到同样的效果吗?
- 此问题似乎不在主题范围内,因为它不在帮助中心中描述的讨论范围内。
你可以先教他们关于步幅符号(::)的知识,然后再把它们切片并应用。
1 2 3
| s = 'string'
s = s[::-1]
print s # gnirts |
参考资料和更多信息:
- 扩展切片
- 关于python的非正式介绍
- python字符串反向解释
为了响应您的评论,您可以提供任意一个参数。
1 2 3 4 5 6
| >>> s[len(s):None:-1]
'gnirts'
>>> s[5:None:-1]
'gnirts'
>>> s[::-1] # and of course
'gnirts' |
- 我在语句s=s[a:b:-1]中插入了a和b的各种值,但无法获得与s=s[::-1]相同的效果。
- 您对a和b使用什么值?
- 我修改了我的答案,将a和b的值合并起来,以复制相同的结果,希望能有所帮助。
- 谢谢!我永远也猜不到。我确实注意到5和6产生了相同的结果,但没有一个是超出我的能力,而0不幸地失败了。
- 是的,0确实非常失败,值得注意的是:None<0的评估结果是True。
两种明显的方法是:
和
对于一个编程新手来说,这两者都是不平凡的,但是所涉及的概念并没有那么困难。
第二种方法更容易理解,如果你首先向他们展示s[::3]、s[::2]和s[::1]的结果。那么,以东十一〔三〕自然就来了。
就这样问他们一个谜语:
为什么?
1 2
| >>> 'dammitimmad'[::-1] == 'dammitimmad'
True |
但是
1 2
| >>> 'dammit im mad'[::-1] == 'dammit im mad'
False |
?
Python中的字符串反转绝对初学者指南。;)
1 2 3 4 5 6 7 8 9 10 11 12
| # Tell them that,
# to reverse a string
# we read it backwards
s = 'string' # input string
l = len(s)
rs = '' # reversed string
for i in range(l-1,-1,-1): # range(start,end,step)
rs += s[i]
print rs |
但这不被认为是Python,我赞成其他人已经发布的更好的方法。
- 我同意这一点。如果您试图使用Python教授基本的编程概念,那么首先使用明显的(如果不是最佳的)方法。一旦他们理解了这个理论,你就可以向他们展示"捷径"。(你知道吗,就像你的数学老师一样?让我恼火的人):然后,如果你的学生已经掌握了基本的编程技能,你想专门教他们Python,那么就做一个切片方法,并利用它来检查切片的一般情况和它的强大程度。
- 您应该避免将坏代码作为任何事情的第一个方法。
- @迈克·格雷厄姆:给他们介绍一些复杂的代码,他们甚至在开始之前就失去了所有的兴趣。尽管我非常了解Python的长处,但欧普说他正在教"计算机编程入门"。
- 你可能已经猜到了,这是我第一次教Python。我确实有前任的笔记,但我想以最有效的顺序介绍新概念。例如,我在while循环之后,但在谈论列表、循环或范围之前引入了不可变的类型。因此,我将首先演示如何使用while循环反转字符串,然后立即显示步幅符号的威力。
- 教过编程之后,我可以证明向他们展示容易理解的"坏代码"是一个很好的开始。只要确保你有足够的时间来告诉他们为什么这不是一个好的方法。一些"最佳"的方法有很多下面的表面魔术正在进行,这将使他们的眼睛釉面。在没有看到其他更好的方法来完成同样的事情之前,不要让他们离开房间,否则"坏代码"会在一夜之间消失,然后你必须在第二天从他们的大脑中挖掘出来。
- @机器管理员教授"计算机编程入门"并不能真正原谅错误的代码,或者必须尝试编写C类代码而不是好的Python代码。您发布的代码在许多Python实现和版本上都具有四层性能,而且在金属层上所做的工作并不比明显、清晰、pythonic、o(n)解决方案更清晰。
- @彼得·罗威尔,这个解决方案有很多地下魔法。它只是更长,更不切题,而且效率可能更低。
- :d我认为学生了解"what bad codes look like"同样重要。
- @迈克·格雷厄姆:同意。我说的是一个更一般的想法,即使用非最优的解决方案来突出算法中的信息流,然后进行更严格和更严格的实现,同时表明正在做出相同的决定。@机械师:一旦你的课再高级一点,把一些真正的嚎叫者放在黑板上撕扯他们会很有趣。在70年代早期的一个正式逻辑课程的介绍中,我们用解剖刀仔细分析尼克松的演讲——除了班上的一些共和党人之外,大家都玩得很开心。-)
- @机械手,一个勇敢的目标,但是有足够的机会在野外看到它,只是没有足够的时间去刮擦所有你能写的坏代码的表面。托尔斯泰的意思是:好的代码都是一样的。所有坏代码都是以自己的方式坏的。
- @迈克:我是一只在Fortran学习编程的恐龙。所以我对"坏代码"的看法可能有点不同。我认为应该能够用可用的工具生成尽可能好的代码。如果没有其他工具,一个真正的大师应该能够用笔记本在墙上钉钉子。-)
- 最佳解决方案始终取决于可用资源。我自己也是一个Fortran程序员(仍然!)尽量使用它。在不同语言中执行类似操作的好代码由于明显的原因看起来明显不同,并且在给定的语言中,好代码和坏代码当然是非常主观的。
将它们引入足够的工具(尤其是数组切片和函数式递归)来完成反转。然后,让他们努力想办法解决一段时间。取几个不同的答案进行比较,说明每种方法的优缺点。
看看这个讨论。