Срезы в Python: индексация строк, списков и кортежей
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Представьте пиццу, разрезанную на 8 кусков с номерами от 0 до 7. Не всегда нужна вся пицца целиком. Иногда нужны куски со 2-го по 5-й. Иногда каждый второй кусок. А иногда три последних.
Срезы в Python позволяют взять часть любой последовательности (списка, строки или кортежа) с помощью одной и той же простой записи. Это одна из самых изящных возможностей Python, и, освоив её, вы будете пользоваться ею повсюду.
В этом уроке вы изучите запись start:stop:step, узнаете, как работают отрицательные индексы и как развернуть любую последовательность, а также познакомитесь с самыми распространёнными приёмами работы со срезами, которыми Python-разработчики пользуются каждый день.
Как работают простые срезы?
Базовый синтаксис среза выглядит так: sequence[start:stop]. Срез возвращает элементы начиная с индекса start и до индекса stop (но не включая его). Можно считать это полуоткрытым интервалом.
['banana', 'cherry'] ['apple', 'banana', 'cherry'] ['cherry', 'date', 'elderberry']
Правило «остановиться перед stop» поначалу может показаться странным. Но у него есть приятное преимущество: fruits[0:3] даёт ровно 3 элемента. Количество элементов в срезе всегда равно stop - start.
[10, 20, 30] [40, 50, 60] [10, 20, 30, 40, 50, 60]
Что делает параметр step?
Полный синтаксис среза выглядит так: sequence[start:stop:step]. Шаг (step) определяет, сколько элементов пропускать между теми, которые вы берёте. Шаг 2 берёт каждый второй элемент. Шаг 3 берёт каждый третий.
[0, 2, 4, 6, 8] [1, 3, 5, 7, 9] [0, 3, 6, 9] [1, 3, 5]
Если вы указываете шаг, по умолчанию start равен 0, а stop совпадает с концом последовательности. Указывать их нужно, только если вы хотите сузить диапазон.
Как работают отрицательные индексы в срезах?
Отрицательные индексы отсчитываются с конца последовательности. -1 обозначает последний элемент, -2 предпоследний и так далее. Отрицательные числа можно использовать в любой части среза: в start, stop или step.
['d', 'e', 'f'] ['a', 'b', 'c', 'd'] ['e', 'f']
Отрицательные индексы невероятно полезны, когда вам нужны элементы, отсчитанные от конца. Например, my_list[-3:] всегда даёт три последних элемента, какой бы длины ни был список.
ytho thon Py
Как развернуть последовательность с помощью [::-1]
Отрицательный шаг заставляет Python идти в обратную сторону. Самый распространённый приём записывается как [::-1] и разворачивает всю последовательность. Ни start, ни stop, шаг -1: Python идёт от конца к началу.
[5, 4, 3, 2, 1] olleh (40, 30, 20, 10)
Отрицательный шаг можно сочетать с start и stop, чтобы развернуть только часть последовательности. При отрицательном шаге start должен быть больше stop, ведь вы движетесь в обратную сторону.
[7, 6, 5, 4, 3] [9, 7, 5, 3, 1]
Срезы строк, списков и кортежей
Один и тот же синтаксис [start:stop:step] работает для всех типов последовательностей. Разница только в том, что вы получаете в результате: срез списка даёт список, срез строки даёт строку, а срез кортежа даёт кортеж.
Alex <class 'str'> [85, 77, 92] (10, 30, 50)
Популярные приёмы со срезами, которые должен знать каждый Python-разработчик
Вот приёмы со срезами, которые вы будете встречать и использовать чаще всего. Считайте это своей шпаргалкой.
['a', 'b', 'c'] ['e', 'f', 'g'] ['b', 'c', 'd', 'e', 'f', 'g'] ['a', 'b', 'c', 'd', 'e', 'f'] ['b', 'c', 'd', 'e', 'f'] ['g', 'f', 'e', 'd', 'c', 'b', 'a']
Срез можно поставить и в левую часть присваивания, чтобы заменить участок списка. Это называется присваиванием срезу.
['red', 'lime', 'sky', 'yellow', 'purple'] ['red', 'orange', 'yellow', 'purple']
Упражнения
Дан список animals. С помощью среза выведите только три средних элемента: ['cat', 'dog', 'elephant'].
Что выведет этот код? Хорошо подумайте, как работают отрицательные индексы.
word = 'programming'
print(word[-4:])Напишите этот код и запустите его, чтобы проверить свой прогноз.
Дан список letters. С помощью среза с шагом выведите только элементы с чётными индексами (0, 2, 4, 6). Должно получиться ['a', 'c', 'e', 'g'].
С помощью среза разверните строку word и выведите результат. Должно получиться nohtyp.
Этот код пытается получить три последних элемента списка, но использует неправильный срез. Исправьте ошибку, чтобы программа вывела ['date', 'elderberry', 'fig'].
Напишите функцию is_palindrome(text), которая возвращает True, если текст читается одинаково слева направо и справа налево, и False в противном случае. Разверните строку с помощью среза. Сначала приведите текст к нижнему регистру, чтобы проверка не зависела от регистра букв.
Проверьте функцию такими вызовами:
print(is_palindrome('racecar'))
print(is_palindrome('Python'))
print(is_palindrome('Madam'))