Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 2 из 20 Начальный 25 мин 120 XP

Срезы в 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'
Развернуть строкусрез с шагом -1s[::-1]
Разобрать на словаsplit без аргументаlen(s.split())
Разобрать CSV-полеsplit с разделителемrow.split(',')
Убрать мусор из серединыreplaces.replace('-', '')
Почистить краяstrips.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])
Проверь себя
0 / 7

1. С какого числа начинаются индексы строки в Python?

2. Что вернёт 'Python'[0:3]?

3. Что вернёт 'кот'[-1]?

4. Как развернуть строку s наоборот?

5. Что вернёт s[10:20], если len(s) равен 6?

6. Что вернёт 'abcde'[2:2]?

7. Как получить строку без последнего символа?

Карточки терминов
Запомнено: 0 / 9
Практика

Переменная day = 'воскресенье' уже задана. Выведи первые три буквы дня, последние три буквы и слово наоборот — всё тремя срезами, без циклов и склеек.

practice.py
Вопросы и ответы по уроку

Как вырезать первые 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-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.