代码遇到意外的无限while循环?

时间:2019-03-28 02:33:56

标签: python

请考虑到我正在做家庭作业,我不想使用任何内置方法,我只使用我学到的东西,即find方法

我正在尝试计算字符串中单词的数量,但这似乎永远存在?我什至尝试将sentence.find(" ", last_position) != -1:设置为while True:

def count_words(sentence):
    count = 0
    last_position = 0

    while sentence.find(" ", last_position) != -1:
        count += 1
        last_position = sentence.find(" ", last_position) + 1

    return count + 1 # +1 because essentially we're only count spaces, not words..

3 个答案:

答案 0 :(得分:2)

find中,start参数被解释为切片参数。如果您不熟悉切片,则包含start。因此,find搜索字符串 includes 刚刚找到的字符的索引。结果,find反复返回相同的索引,从而创建了无限循环。

要解决此问题,如jasonharper所述,只需添加1:

last_position = sentence.find(" ", last_position) + 1

答案 1 :(得分:0)

使用现有代码的老派方式。进一步了解find()

def count_words(sentence):
    count = 0
    last_position = sentence.find(" ", 0)  
    while last_position != -1:
        count += 1
        last_position+=1
        last_position = sentence.find(" ", last_position)

    return count+1

result = count_words('my name is always sunny')
print(result)

答案 2 :(得分:0)

调试(使用ipython):

In [2]: s = 'asdfasdf asdf asdf asd sdfa'
In [4]: def count_words(sentence):
   ...:     count = 0
   ...:     last_position = 0
   ...:
   ...:     while sentence.find(" ", last_position) != -1:
   ...:         count += 1
   ...:         print(f'count: {count}, position: {last_position}')
   ...:         last_position = sentence.find(" ", last_position)
   ...:         print(f'new position: {last_position}')
   ...:         if count > 4:
   ...:             break
   ...:     return count
   ...:

In [5]: count_words(s)
count: 1, position: 0
new position: 8
count: 2, position: 8
new position: 8
count: 3, position: 8
new position: 8
count: 4, position: 8
new position: 8
count: 5, position: 8
new position: 8
Out[5]: 5

看看原因:

In [6]: s.find?
Docstring:
S.find(sub[, start[, end]]) -> int

Return the lowest index in S where substring sub is found,
such that sub is contained within S[start:end].  Optional
arguments start and end are interpreted as in slice notation.

Return -1 on failure.
Type:      builtin_function_or_method

修复:

In [7]: def count_words(sentence):
   ...:     count = 0
   ...:     last_position = 0
   ...:
   ...:     while sentence.find(" ", last_position) != -1:
   ...:         count += 1
   ...:         last_position = sentence.find(" ", last_position+1)
   ...:     return count
   ...:

In [8]: count_words(s)
Out[8]: 5