Срезы в Python: s[start:stop:step]
Срез — способ вырезать из строки кусок: первые пять символов, последние три, каждый второй, строка наоборот. Разбираем s[start:stop:step] до автоматизма: индексы, границы, шаг.
Редакция Питоники
В первом уроке мы узнали, что строку нельзя изменить, но можно собрать новую. Главный инструмент для этого — срез: запись вида s[start:stop:step], которая вырезает из строки кусок и возвращает его как новую строку. Срезы встречаются в Python повсюду: обрезка кода страны из номера, первые буквы имени, последние цифры счёта, разворот текста.
Разберём все три числа по очереди: сначала индексы, потом границы, потом шаг.
Индексы считаются с нуля
Каждый символ строки имеет номер — индекс. Нумерация начинается с нуля: у слова Python шесть символов с индексами от 0 до 5. К символу обращаются квадратными скобками:
word = 'Python'
print(word[0])
print(word[1])
print(word[5])
print(len(word))
P y n 6
Обрати внимание на связь: длина строки 6, а последний индекс — 5. Последний символ всегда s[len(s) - 1]. Запросишь индекс за пределами — Python честно упадёт с ошибкой:
word = 'Python'
try:
word[6]
except IndexError as e:
print('Ошибка:', e)
Ошибка: string index out of range
Срез s[start:stop]: правая граница не входит
Срез записывается как s[start:stop] и забирает символы от start включительно до stop не включительно. Это самое важное правило урока, на нём спотыкаются все:
word = 'Python'
print(word[0:2])
print(word[2:5])
print(word[0:6])
print(word[:2])
print(word[2:])
print(word[:])
Py tho Python Py thon Python
Разберём построчно. word[0:2] — индексы 0 и 1, двойка не вошла. word[2:5] — индексы 2, 3, 4, пятёрка не вошла. У среза есть удобные умолчания: если опустить start, берём с начала, если опустить stop — до конца, опустить оба — копия всей строки. Именно это сделали word[:2] и word[2:], а вместе они покрывают слово без остатка: Py плюс thon.
Отрицательные индексы: счёт с конца
Индексы могут быть отрицательными: -1 — последний символ, -2 — предпоследний и так далее. Это не «обратный порядок», а просто другой отсчёт — от конца строки:
word = 'Python'
print(word[-1])
print(word[-3:])
print(word[:-2])
n hon Pyth
Отрицательные индексы работают и как границы среза: word[-3:] — последние три символа («от третьего с конца до конца»), word[:-2] — вся строка без последних двух. Сочетание «минус число и двоеточие» покрывает добрую половину бытовых задач: последние цифры счёта, расширение файла, хвост строки.
Шаг: каждый второй и разворот
Третье число в срезе — шаг: сколько символов пропускать. s[::2] берёт каждый второй символ, s[::3] — каждый третий. А если шаг отрицательный, строка идёт справа налево — знаменитый разворот s[::-1]:
word = 'Python'
print(word[::2])
print(word[1::2])
print(word[::-1])
Pto yhn nohtyP
word[::2] прошёл по индексам 0, 2, 4 и собрал Pto. word[1::2] начал с единицы: индексы 1, 3, 5 — yhn. Разворот word[::-1] читает строку с конца налево: индексы 5, 4, 3, 2, 1, 0. Разворот — классическая проверка палиндрома: слово читается одинаково в обе стороны,
word = 'казак'
print(word == word[::-1])
True
word = 'Python'
print(word[10:20])
print(word[-100:100])
Python
Первая строка вывода пуста — word[10:20] вернул пустую строку, и print перевёл строку. А word[-100:100] вернул всю строку целиком: границы зажали её с обеих сторон, но ничего не сломали.
Срез возвращает новую строку
Из урока 1 мы знаем: строки неизменяемы. Срез не исключение — он не вырезает кусок из исходной строки, а создаёт новую строку из скопированных символов. Исходная остаётся целой, что бы вы ни делали со срезом:
word = 'Python'
piece = word[2:5]
print(piece)
print(piece.upper())
print(word)
tho THO Python
Даже после piece.upper() — а этот метод встретится в уроке 5 — переменная word осталась прежней: метод тоже вернул новую строку. Со срезами это свойство особенно полезно: можно свободно резать строку на части, не боясь испортить оригинал.
Сценарий: разбор номера заказа
Заказы приходят с кодами вида ORD-2026-0042. Пользователю номер показывают целиком, в лог пишут только год, а в письме отправляют последние четыре цифры. Все три задачи решаются срезами — и ни одна не требует цикла.
order = 'ORD-2026-0042'
year = order[4:8]
tail = order[-4:]
print(year)
print(tail)
print(order[:4])
2026 0042 ORD-
Три среза — и ни одного цикла. Слева отрезали префикс, справа — хвост, посередине — год. Правая граница в order[4:8] не входит, поэтому год закончился на восьмом символе, а дефис на позиции 8 в срез не попал.
Пустой срез — это не ошибка
Если границы сошлись или разъехались, срез просто пуст — без всяких исключений. Это отличает срезы от одиночных индексов и делает их безопасными в коде, где длину строки заранее никто не знает.
order = 'ORD-2026-0042'
print('[' + order[4:4] + ']')
print('[' + order[100:200] + ']')
print('[' + order[-1:-1] + ']')
[] [] []
Срез, split или replace: что выбрать
Три инструмента умеют разбирать строку, и путать их — источник лишних пары сотен строк кода. Правило простое: нужен кусок по границам — срез; нужен список слов или полей по разделителю — split; нужно убрать или заменить мусор — replace.
| Задача | Инструмент | Пример |
|---|---|---|
| Взять первые N символов | срез | order[:4] → 'ORD-' |
| Взять последние N символов | срез с минусом | order[-4:] → '0042' |
| Развернуть строку | срез с шагом -1 | s[::-1] |
| Разобрать на слова | split без аргумента | len(s.split()) |
| Разобрать CSV-поле | split с разделителем | row.split(',') |
| Убрать мусор из середины | replace | s.replace('-', '') |
| Почистить края | strip | s.strip() |
Срез и split иногда выглядят взаимозаменяемыми: и то, и другое «режет строку». Разница в том, что срез работает с границами — символы с номера N до номера M, а split — с разделителем: там, где стоит запятая. Спросите себя: у меня есть номера символов или у меня есть символ-разделитель?
Как устроен срез под капотом
Срез в Python — не отдельная операция над памятью, а объект slice с тремя полями: start, stop, step. Когда вы пишете order[4:8], Python создаёт этот объект и передаёт его в метод __getitem__ строки. Тот приводит границы к реальным пределам строки и собирает новую строку из нужных символов.
Отсюда же объясняются две особенности. Первая: срез за границами не падает — границы сдвигаются, а не проверяются на ошибку. Вторая: отрицательные границы превращаются в позиции с конца, и именно поэтому order[-1] — последний символ, а order[-1:] — последний символ вместе с пустым хвостом.
Мини-практика: три среза за один заказ
Три задания, которые стоит выполнить прямо здесь: достать из кода заказа год, отбросить префикс с годом, оставив только номер, и развернуть код заказа наоборот.
order = 'ORD-2026-0042'
print(order[4:8])
print(order[9:])
print(order[::-1])
2026 0042 2400-6202-DRO
Карточка срезов
| Запись | Результат для 'Python' | Почему |
|---|---|---|
word[0:2] | 'Py' | индексы 0 и 1, двойка не входит |
word[2:] | 'thon' | от двойки до конца |
word[-3:] | 'hon' | последние три символа |
word[:-2] | 'Pyth' | всё, кроме последних двух |
word[::2] | 'Pto' | каждый второй символ |
word[::-1] | 'nohtyP' | разворот строки |
Дальше — как вставлять значения в текст красиво: f-строки в уроке 3. А срезы вернутся ещё не раз: чистка краёв в уроке про strip и сборка новых строк в уроке про replace опираются на них напрямую.
Срез — это копия, а не ссылка: s[start:stop:step] возвращает новую строку, исходная остаётся неизменной, а выход за границы не вызывает ошибку.
Сначала предскажи ответ в голове — это главный навык программиста.
word = 'Python'
print(word[1:4])
word = 'кот'
print(word[::-1])
word = 'abcdef'
print(word[-2:])
print(word[:-2])
1. С какого числа начинаются индексы строки в Python?
2. Что вернёт 'Python'[0:3]?
3. Что вернёт 'кот'[-1]?
4. Как развернуть строку s наоборот?
5. Что вернёт s[10:20], если len(s) равен 6?
6. Что вернёт 'abcde'[2:2]?
7. Как получить строку без последнего символа?
Переменная day = 'воскресенье' уже задана. Выведи первые три буквы дня, последние три буквы и слово наоборот — всё тремя срезами, без циклов и склеек.
Как вырезать первые N символов строки в Python?
Срезом без первого числа: s[:N]. Для строки 'Python' срез [0:3] и [:3] дают одинаковое 'Pyt' — нулевой start можно опускать. Длина такого среза равна N, а правая граница в срез никогда не включается.
Урок 3: f-строкиКак перевернуть строку в Python?
Срезом с отрицательным шагом: s[::-1] возвращает копию строки в обратном порядке. Так проверяют палиндромы: word == word[::-1]. Альтернатива через ''.join(reversed(s)) длиннее и нужна реже.
Чем срез отличается от индекса?
Индекс s[5] возвращает один символ и падает с IndexError за пределами строки. Срез s[2:7] возвращает новую строку из нескольких символов и за пределами просто возвращает то, что есть — даже пустую строку, ошибки не будет.
Урок 6: stripЧто значит запись s[:-2]?
Это срез от начала строки до индекса -2 не включительно, то есть вся строка без двух последних символов: 'Python'[:-2] — 'Pyth'. Отрицательный индекс в правой границе считается от конца строки.
Как убрать последний символ строки в Python?
Срезом с отрицательной правой границей: s[:-1] вернёт строку без последнего символа. Если символов много, логика та же — просто отбросьте нужное количество с конца: s[:-3] оставит всё, кроме трёх последних букв.
Урок 1: строки как данныеЧем срез отличается от split?
Срез берёт кусок по номерам символов: s[4:8] — символы с четвёртого по восьмой. Split режет по разделителю и возвращает список: row.split(',') — части между запятыми. Спросите себя: у меня есть границы или есть разделитель?
Урок 9: splitПонравился урок? Сошлитесь на него
«Срезы встречаются в Python повсюду: обрезка кода страны из номера, первые буквы имени, последние цифры счёта, разворот текста.»
Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Строки · Урок 1
Строки в Python: текст как данные
Строка — самый частый тип данных в реальных задачах: имена, города, сообщения. Знакомимся с типом str: кавычки, len, конкатенация и умножение — и узнаём, почему строку нельзя переписать на месте.
Строки · Урок 3
f-строки: вставить значение в текст
f-строка вставляет значение прямо в текст: f'Привет, {name}!' — без плюсов, скобок и str(). Внутри фигурных скобок работает любое выражение Python. Учимся читать и писать их свободно.
Строки · Урок 6
strip: обрезаем пробелы и мусор
Пробелы по краям — самая частая грязь в данных: ввод пользователя, поля CSV, строки из файлов. Знакомимся с strip, lstrip и rstrip — и с аргументом-набором символов.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
NumPy · Урок 3
Индексация и срезы массивов NumPy: как достать любой элемент
Индексы с нуля и с конца, срезы с шагом, строки и столбцы двумерных массивов — и главный подводный камень NumPy: срез возвращает view, а не копию. С примерами, разбором ошибок и шпаргалкой.
срезы массива pythonиндексация и срезы numpy примеры
Pandas · Урок 3
Выборка данных в Pandas: loc, iloc и фильтрация строк по условию
loc и iloc, булева маска, isin и between — достаём из таблицы заказов именно те строки и столбцы, которые нужны, и не попадаемся на SettingWithCopyWarning.
как отфильтровать строки в pandas по условиюpandas выбрать строки по условию
Строки · Урок 5
Регистр: lower, upper, title
Один и тот же текст бывает написан как «Аня», «АНЯ» и «аня» — для Python это три разные строки. Знакомимся с методами регистра: lower, upper, title, capitalize и swapcase.
python строки методы регистрpython привести строку к нижнему регистру