请考虑到我正在做家庭作业,我不想使用任何内置方法,我只使用我学到的东西,即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..
答案 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