使用循环时,我经常会编写两次代码。例如,在复习 Udacity 计算机科学课程时,我编写了代码(用于查找最连续重复的元素的函数):
def longest_repetition(l):
if not l:
return None
most_reps = count = 0
longest = prv = None
for i in l:
if i == prv:
count += 1
else:
if count > most_reps:
longest = prv
most_reps = count
count = 1
prv = i
if count > most_reps:
longest = prv
return longest
在这种情况下,我将检查两次计数是否大于先前最重复的元素。当当前元素与上一个元素不同以及到达列表末尾时都会发生这种情况。
在逐个字符解析字符串时,我也遇到过几次这种情况。也有几次代码达到 5 行左右。这是常见的,还是我思考/编码方式的结果。我应该怎么办?
编辑:同样,在一个人为的字符串分割示例中:
def split_by(string, delimeter):
rtn = []
tmp = ''
for i in string:
if i == delimeter:
if tmp != '':
rtn.append(tmp)
tmp = ''
else:
tmp += i
if tmp != '':
rtn.append(tmp)
return rtn
编辑:此考试是为该课程的学生编写的,他们不需要具备任何 Python 外部知识;仅限于之前单元中所教授的内容。尽管我之前确实有 Python 经验,但我试图遵守这些限制以充分利用本课程。像 str.split、列表和许多 Python 基础知识这样的东西都被教授了,但还没有关于导入的东西——尤其是像 groupby 这样的东西。话虽如此,如果没有编程入门课程中可能不会教授的任何语言功能,应该如何编写它呢?
自从你标记了language-agnostic
,我发现你不会对 Python 特定的东西感兴趣,你可以使用这些东西来使你的代码高效、紧凑和可读。出于同样的原因,我不会展示用 python 编写的代码有多么漂亮。
在某些情况下,额外if
最后可以根据您的算法来避免,但大多数情况下就像“如果存在,它应该是重要的和/或高效的”。我不知道 python 解释器是如何工作的,但在 C/C++/等编译语言中。编译器执行各种类型的循环优化,包括将 if 块移出循环(如果它执行相同的操作)。
我跑了一下,比较了各个片段的运行时间:
- @JFSebastian - 8.9939801693
- @srgerg - 3.13302302361
- 你的 - 2.8182990551。
这不是一个概括,即尾随if
给你最好的时光。我的观点是:只要遵循你的算法,并尝试优化它。没有什么问题if
在最后。替代解决方案可能很昂贵。
关于您输入的第二个示例:支票tmp == ''
这样做是为了确保只返回非空字符串。这实际上是分割算法的一种附加条件。无论如何,您都需要额外的rtn.append
在循环之后,因为最后一个分隔符之外还有一些内容。您始终可以将 if 条件推入循环内,例如if curCharIndex == lastIndex: push items to list
它将在每次迭代中执行,并且再次出现相同的情况。
我的回答简而言之:
- 您的代码与您心中的算法一样高效。
- The
if
在很多情况下都会遇到最后的情况——无需担心它们,它们可能会使代码比没有这样的 if 的替代方法更有效(示例就在这里)。
- 此外,编译器还可以发现并修改/移动代码周围的块。
- 如果有一种语言功能/库可以使您的代码快速且可读,请使用它。 (这里的其他答案指出了 python 提供的功能:))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)