Бесплатный курс по Python. Зарегистрируйтесь для отслеживания прогресса →

Python: Срезы строк

Работая со строками в программировании, регулярно приходится извлекать подстроки из строки. Подстрокой называется какая-то часть строки. Представим, что у нас есть дата в таком формате: 12-08-2034. Как извлечь из этой строки подстроку, в которую входит только год?

Если подумать логически, то для извлечения года, нам нужно посчитать индекс символа с которого начинается год и затем извлечь четыре символа. Индексы в строке начинаются с нуля, а значит первый символ года доступен по индексу 6, а последний символ находится по индексу 9. Проверим:

value = '12-08-2034'

print(value[6]) # => 2
print(value[9]) # => 4

Теперь, зная эти индексы, мы можем воспользоваться срезами для получения нужной подстроки:

value = '12-08-2034'

year = value[6:10]
print(year) # => 2034

Срезы для строк в Python - это механизм, с помощью которого извлекается подстрока по указанным параметрам. В примере выше мы взяли подстроку начиная с 6 индекса по 10 индекс не включая, то есть с 6 по 9 включительно. Формула выглядит так:

str[начальный индекс:конечный индекс]

# Пара примеров
value = '01-12-9873'

# Срез строки это всегда строка,
# даже если внутри строки было число.
value[1:2] # '1'
value[3:5] # '12'

Срезы очень мощный механизм с большим количеством вариаций, например, если не указать вторую границу, то извлечение произойдет до конца строки, тоже самое с первой границей (началом строки):

value = 'Hexlet'
value[3:] # 'let'
value[:3] # 'Hex'

Мы можем указать даже отрицательные индексы. В таком случае отсчет идет с обратной стороны:

value = 'Hexlet'
# Правая граница отрицательная. Считаем -1 от конца строки
value[3:-1] # 'le'
# Левая граница отрицательная. Считаем -5 от конца строки
value[-5:3] # 'ex'

У срезов есть третий необязательный параметр - шаг извлечения. По умолчанию он равен единице, но мы можем его изменить:

value = 'Hexlet'
value[1:5:2] # el
# 1:5 это 'exle'
# шаг 2 это каждый второй, то есть 'e' и 'l'

Все это можно комбинировать с открытыми границами, то есть без указания начала или конца:

value = 'Hexlet'
value[:5:2] # 'Hxe'
value[1::2] # 'elt'

Шаг может быть отрицательным, в таком случае он берется с конца. Из этого вытекает самый популярный способ использования шага - переворот строки:

value = 'Hexlet'
# Пропускаем обе границы
value[::-1] # 'telxeH'

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

value = 'Hexlet'
# Символ с индексом 1 не будет включён в подстроку
value[4:1:-1] # 'elx'

Срезы можно указывать не только через числа, но и с использованием переменных:

value = 'Hexlet'
start = 1
end = 5
value[start:end] # 'exle'

Как видите, срезы способны на многое. Не переживайте, что прямо сейчас вы не запомните все эти комбинации, это нормально. Со временем вы научитесь их использовать без подглядывания в документацию.

Задание

В переменной value лежит значение Hexlet. Извлеките из него и выведите на экран срез, который получит подстроку xle. Это задание можно сделать разными способами.

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе