Срезы строк
В предыдущем уроке мы научились работать с конкретными символами строки с помощью индексов []
. Иногда нужно бывает работать с целыми частями строки, в таком случае мы используем срезы (slices). Срезы похожи на комбинацию индексации и функции range()
.
Рассмотрим строку s = 'abcdefghij'
.
Положительные индексы |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Строка |
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
Отрицательные индексы |
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
С помощью среза мы можем получить несколько символов исходной строки, создав диапазон индексов разделенных двоеточием s[x:y]
.
Следующий программный код:
print(s[2:5])
print(s[0:6])
print(s[2:7])
выводит:
cde
abcdef
cdefg
При построении среза s[x:y]
первое число – это то место, где начинается срез (включительно), а второе – это место, где заканчивается срез (невключительно). Разрезая строки, мы создаем подстроку, которая по сути является строкой внутри другой строки.
Срез до конца, от начала
Если опустить второй параметр в срезе s[x:]
(но поставить двоеточие), то срез берется до конца строки. Аналогично если опустить первый параметр s[:y]
, то можно взять срез от начала строки. Срез s[:]
совпадает с самой строкой s
.
Следующий программный код:
print(s[2:])
print(s[:7])
выводит:
cdefghij
abcdefg
Срез s[:]
возвращает исходную строку.
Отрицательные индексы в срезе
Мы также можем использовать отрицательные индексы для создания срезов. Как уже говорилось ранее, отрицательные индексы строки начинаются с -1
и отсчитываются до достижения начала строки. При использовании отрицательных индексов первый параметр среза должен быть меньше второго, либо должен быть пропущен.
Следующий программный код:
print(s[-9:-4])
print(s[-3:])
print(s[:-3])
выводит:
bcdef
hij
abcdefg
Удалить из строки последний символ можно при помощи среза s[:-1]
.
Шаг среза
Мы можем передать в срез третий необязательный параметр, который отвечает за шаг среза. К примеру, срез s[1:7:2]
создаст строку bdf
состоящую из каждого второго символа (индексы 1, 3, 5
, правая граница не включена в срез).
Отрицательный шаг среза
Если в качестве шага среза указать отрицательное число, то символы будут идти в обратном порядке.
Следующий программный код:
print(s[::-1])
выводит:
jihgfedcba
Следующий программный код:
print(s[1:7:2])
print(s[3::2])
print(s[:7:3])
print(s[::2])
print(s[::-1])
print(s[::-2])
выводит:
bdf
dfhj
adg
acegi
jihgfedcba
jhfdb
Подводя итог
s = 'abcdefghij'
Программный код |
Результат |
Пояснение |
s[2:5] |
cde |
строка состоящая из символов с индексами 2, 3, 4 |
s[:5] |
abcde |
первые пять символов строки |
s[5:] |
fghij |
строка состоящая из символов с индексами от 5 до конца |
s[-2:] |
ij |
последние два символа строки |
s[:] |
abcdefghij |
вся строка целиком |
s[1:7:2] |
bdf |
строка состоящая из каждого второго символа с индексами от 1 до 6 |
s[::-1] |
jihgfedcba |
строка в обратном порядке, так как шаг отрицательный |
Изменение символа строки по индексу
Предположим, у нас есть строка s = 'abcdefghij'
и мы хотим заменить символ с индексом 4 на 'X'
. Можно попытаться написать код:
s[4] = 'X'
Однако такой код не работает. В Python строки являются неизменяемыми, то есть мы не можем менять их содержимое с помощью индексатора.
Если мы хотим поменять какой-либо символ строки s
, мы должны создать новую строку. Следующий код использует срезы и решает поставленную задачу:
s = s[:4] + 'X' + s[5:]
Мы создаем два среза: от начала строки до 3 символа и с 5 символа по конец строки, а между ними вставляем нужный нам символ, который встанет на 4 позицию.
Примечания
Примечание 1. Синтаксис срезов строк очень похож на синтаксис функции range()
.
Примечание 2. Если первый параметр среза больше второго, то срез создает пустую строку.