Код попадает в неожиданный бесконечный цикл while?

Попробуйте это -

$(document).on( 'click', '.click-activity', function () { ... });
0
задан Adam G 28 March 2019 в 02:43
поделиться

3 ответа

Отладка (используйте 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
0
ответ дан Waket Zheng 28 March 2019 в 02:43
поделиться

В find аргумент start интерпретируется как аргумент среза. Если вы не знакомы с кусочками, start включен. Поэтому find ищет строку , включая индекс только что найденного символа. В результате этого find многократно возвращает один и тот же индекс, создавая бесконечный цикл.

Чтобы исправить это, как упомянул Джейсонхарпер, просто добавьте 1:

last_position = sentence.find(" ", last_position) + 1
0
ответ дан Tomothy32 28 March 2019 в 02:43
поделиться

Старая школа с вашим существующим кодом. Подробнее о 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)
0
ответ дан Always Sunny 28 March 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: