Как этот код не получает ошибку индекса, когда переменная l oop достигает конца диапазона в a для l oop? - PullRequest
0 голосов
/ 26 февраля 2020

Это была проблема HW в edX, которая попросила меня определить, сколько раз слово "bob" встречалось в какой-либо строке. Я нашел решение, но я не уверен, почему оно работает. Для кода (1):

CODE (1)

s = 'azcbobobegghakl'
count = 0
for i in range(len(s)):
    if s[i:i+3] == "bob":
        count += 1
print(count)

В том же HW возникла проблема, которая попросила меня найти самую длинную подстроку в алфавитном порядке в некоторой строке , В начале поиска решения я столкнулся с ошибкой индекса, потому что пытался сослаться на индекс, выходящий за пределы диапазона; показано в этом коде:

КОД (2)

s = 'azcbobobegghakl'
temp = ''
longest = ''
for i in range(len(s)):
    if s[i] <= s[i+1]:
        temp += s[i+1]
        if len(temp) > len(longest):
            longest = temp
    else:
        temp = s[i+1]
print(longest)

ОШИБКА (2)

Traceback (most recent call last):
  File "C:/Users/vchi/PycharmProjects/edX/introduction.py", line 5, in <module>
    if s[i] <= s[i+1]:
IndexError: string index out of range

Почему КОД (1) не сталкивается с та же самая ошибка, которую CODE (2) получил, когда i> len (s) -4 и s [i: i + 3] пытаются сослаться на вещи, которые находятся за пределами? Заранее спасибо!

1 Ответ

1 голос
/ 26 февраля 2020

Python нарезка во многих случаях странна, и это один из примеров, подтверждающий это.

Со строками в python, если срез выходит за пределы диапазона, он просто установит «конец» среза как последний жизнеспособный индекс, поэтому, если мы сделали что-то вроде:

a = 'boboabcdef'

и затем: для списков python имеет гораздо более строгую интерпретацию, поскольку было бы невероятно трудно отладить программу, в которой список мог бы go выходить из индекса без ошибок или предупреждений.

...