在Python中调试单词中字母的数量

4 投票
9 回答
41080 浏览
提问于 2025-04-16 09:13

我正在尝试计算一个单词中'e'出现的次数。

def has_no_e(word):     #counts 'e's in a word
    letters = len(word)
    count = 0
    while letters >= 0:
        if word[letters-1] == 'e':
            count = count + 1
        letters = letters - 1
    print count

除了当这个单词以'e'结尾时,它会把那个'e'算两次,其他情况都挺好的。我不知道为什么会这样。谁能帮帮我?

我知道我的代码可能写得不太好,我还是个初学者!我只是想弄清楚发生了什么逻辑。

9 个回答

1

@marcog 提出了很好的观点;

与此同时,你可以通过插入打印语句来进行简单的调试 -

def has_no_e(word):
    letters = len(word)
    count = 0
    while letters >= 0:
        ch = word[letters-1]         # what is it looking at?
        if ch == 'e':
            count = count + 1
            print('{0} <-'.format(ch))
        else:
            print('{0}'.format(ch))
        letters = letters - 1
    print count

然后

has_no_e('tease')

返回

e <-
s
a
e <-
t
e <-
3

你可以看到

  1. 你正在反向遍历字符串
  2. 它正确识别了字母 e
  3. 你在字符串的末尾“绕回” - 所以如果你的字符串以 e 结尾,就会多出一个 e
14
>>> word = 'eeeooooohoooooeee'
>>> word.count('e')
6

为什么不这样做呢?

12

正如其他人提到的,你可以用简单的 word.count('e') 来实现这个测试。除非你只是想做个简单的练习,否则这比重新发明轮子要好得多。

你代码的问题在于,它把最后一个字符计算了两次,因为你在最后测试了索引 -1,在Python中这会返回字符串的最后一个字符。你可以把 while letters >= 0 改成 while letters > 0 来修复这个问题。

如果你把这当作学习练习,还有其他方法可以让你的代码更整洁:

  • Python提供了一种很好的方式来遍历字符串,使用 for 循环。这比用 while 循环和自己维护计数器要简洁得多。正如你在这里看到的,增加复杂性会导致错误。保持简单。
  • 大多数编程语言都有 += 操作符,对于整数来说,它会把一个数加到变量上。这比 count = count + 1 更简洁。
  • 使用参数来定义你要计数的字符,这样会更灵活。在参数列表中定义一个默认参数,比如 char='e',当你有明显的默认值时。
  • 给函数选择一个更合适的名字。名字 has_no_e() 让人觉得这个代码是在检查是否没有字母e,但实际上它是计算字母e出现的次数。

把这些都结合起来,我们得到:

def count_letter(word, char='e'):
    count = 0
    for c in word:
        if c == char:
            count += 1
    return count

一些测试:

>>> count_letter('tee')
2
>>> count_letter('tee', 't')
1
>>> count_letter('tee', 'f')
0
>>> count_letter('wh' + 'e'*100)
100

撰写回答