Рубрики
Без рубрики

Почему нарезка с индексом вне диапазона работает в Python?

Нарезание Python означает доступ к подпоследовательности типа последовательности с использованием записи [Пуск: End]. Немного известной особенностью нарезки является то, что у нее есть надежные конечные индексы. Нарезка надежна, даже если окончательный индекс больше, чем максимальный индекс последовательности. Ломтик просто принимает все элементы до максимального элемента. Если … Почему нарезка с индексом вне диапазона работает в Python? Прочитайте больше “

Автор оригинала: Chris.

Python нарезка означает получить доступ к подпоследовательности типа последовательности с использованием обозначения [Пуск: конец] Отказ Мало известной особенностью нарезки является то, что у нее есть Простые конечные индексы Отказ Нарезка надежна, даже если конец индекс больше чем максимальный индекс последовательности. Ломтик просто принимает все элементы до максимального элемента. Если индекс запуска также выходит из границ, он возвращает пустой ломтик.

Нарезка: остановка индекса из границ и запуска индекса внутри границ

Что произойдет, если индекс запуска данной операции нарезки находится в пределах, когда индекс остановки находится снаружи?

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

Вот пример для строки:

>>> s = 'hello'
>>> s[1:100]
'ello'
>>> s[3:100]
'lo'

Вот пример для списка:

>>> lst = [1, 2, 3]
>>> lst[1:100]
[2, 3]
>>> lst[3:100]
[]

Окончательный пример lst [3: 100] объясняется следующим!

Нарезка: начать и остановить индекс вне оценки

Работа нарезки не повышает ошибку, если ваши индексы запуска и остановки больше, чем длина последовательности. Это в отличие от простой индексации – если вы индексируете элемент, выходящий из границ, Python выброс индекс ошибки границ. Однако с нарезкой просто возвращает пустую последовательность.

Вот пример для строки:

>>> s = 'hello'
>>> s[100:200]
''

И вот пример для списка:

>>> lst = [1, 2, 3]
>>> lst[100:200]
[]

Это то, что произойдет, если вы попытаетесь индексировать элемент за пределами границ:

>>> lst = [1, 2, 3]
>>> lst[100]
Traceback (most recent call last):
  File "", line 1, in 
    lst[100]
IndexError: list index out of range

Почему не нарезает прерываний приводит к ошибке? [Дизайн мотивации]

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

Здесь нет точной науки, но я нахожу решение очень разумным из-за следующих причин.

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

Да, вы могли бы вернуть Нет в случае индексации. Тем не менее, это сделало бы невозможным дифференцировать между двумя случаями, когда Нет Элемент хранится в списке и где список не имеет элемента вообще.

Документация Показывает окончательную причину для этого:

“Ломтик s из i к j с шагом k определяется как последовательность предметов с индексом х + н * к Такое что 0 <(j-i)/k Отказ Другими словами, индексы i , Я + К. , I + 2 * K , Я + 3 * К и так далее, останавливаясь, когда j достигнут (но никогда не включаю j ). Когда k положительно, i и j уменьшены до Лен (ы) Если они больше “

Это ясно объясняет, почему семантика – это способ: в нашем случае индексы Я и J уменьшены до ЛЕН (S) Отказ Итак, у вас есть ломтик ЛЕН (S) к ЛЕН (S) Исключен, что является пустой последовательностью по определению.

Нарезание головоломки: проверить свои навыки

Можете ли вы решить следующую головоломку о запрещенных индексах Python Besthooting?

word = "galaxy"
print(word[4:50])

Что такое выход этого кода фрагмент?

Вы можете проверить ваше решение против нашего золотого стандарта на приложении Finxter.com и отслеживать свои навыки.

Официальная документация

Если вы хотите разместить в документах, которые указывают на объяснение этой проблемы, вот оно:

« Вырожденные индексы нарезки изящно обрабатываются: индекс, который слишком велик, заменяется по размеру строки, верхняя граница меньше, чем нижняя граница, возвращает пустую строку. » – Официальная документация Python 3

>>> word[1:100]
'elpA'
>>> word[10:]
''
>>> word[2:1]
''

Связанное видео.

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.