Индексы и срезы строк


На самом деле в Python строка представляются как упорядоченная коллекция символов. И ключевое слово здесь – «упорядоченная». Это значит, что у каждого символа в строке есть свой порядковый номер – индекс, по которому мы можем его получить. Например, когда мы создаем строку

msg = "Hello World!"

то формируется следующая коллекция:

Каждый символ имеет свой индекс, начиная с нулевого. Первый символ в Python всегда имеет нулевой индекс.

Для обращения к тому или иному символу используется следующий синтаксис:

<строка>[<индекс>]

Например:

msg[0]

msg[6]

и так далее. Но, если указать неверный индекс, например:

msg[12]

то возникнет ошибка. Поэтому здесь следует быть аккуратным и не выходить за пределы этого списка. В частности, последний «рабочий» индекс можно определить с помощью функции len – длины строки:

lastIndex = len(<строка>) – 1

То есть, к последнему индексу мы можем обратиться так:

msg[len(msg)-1]

Но это не очень удобно. Поэтому разработчики языка Python решили, что отрицательные индексы будут означать движение по строке с конца в начало. И предыдущую запись можно переписать так:

msg[-1]

Видите? Это намного удобнее. То есть, у строк есть еще такие отрицательные индексы:

Также в Python можно использовать доступ к отдельному символу непосредственно у строкового литерала:

"abcd"[1]

"abcd"[-1]

Иногда это бывает удобно.

Срезы

Часто в программировании требуется выбрать не один какой-то символ, а сразу несколько. Для этого используются так называемые срезы. Их работу проще показать на конкретных примерах. Пусть у нас есть наша строка:

msg = "Hello World!"

и мы хотим выделить последнее слово «World!». Для этого в квадратных скобках указывается начальный индекс и через двоеточие – конечный. Если мы запишем все вот в таком виде:

msg[6:11]

то получим результат «World» без восклицательного знака. Дело в том, что последний индекс исключается из интервала, то есть, интервал определяется как

[6: 11)

Поэтому, мы должны записать срез так:

msg[6:12]

Другой пример для выделения символов «llo»:

msg[2:5]

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

msg[:5]

выделяет слово «Hello», а вот так:

msg[6:]

получим «World!». Наконец, записав все в таком виде:

msg[:]

получим ту же самую строку, не копию! Это можно проверить так:

copy = msg[:]

print(id(copy), id(msg))

Увидим одно и то же значение id для обеих переменных, это означет, что они ссылаются на один и тот же объект.

В срезах на Python можно дополнительно указывать шаг через двоеточие. Например, так:

msg[::2]

мы здесь ставим еще одно двоеточие и указываем шаг 2, то есть, идем через символ: «HloWrd». Также это можно комбинировать с граничными значениями:

msg[:5:2]

msg[6::2]

msg[1:6:2]

и использовать отрицательный шаг:

msg[::-1]

в этом случае символы будут перебираться в обратном порядке.

Строка – неизменяемый объект

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

msg[0] = 'A'

приведет к ошибке, говорящая о том, что строка не может быть изменена. Тогда как в Python нам изменять строки? Для этого создается новая строка с нужным содержимым. Например, изменим строку

«Hello World!»

на строку

«Hello word!»

Это можно сделать так:

myStr = msg[:6]+"w"+msg[7:9]+msg[10:]

В результате строка myStr ссылается на новую измененную строку, а msg осталась прежней.

Задания для самоподготовки

1. Напишите программу подсчета букв ‘a’ в строке «abrakadabra».

2. Из строки «abrakadabra» удалите все сочетания «ab».

3. Напишите программу определения слова палиндрома (это слова, которые одинаково читаются в обоих направлениях, например, анна, abba и т.п.). Слово вводится с клавиатуры.

4. Напишите программу определения количества вхождений фраз «ra» в слове «abrakadabra».

5. Разделите введенное с клавиатуры предложение на слова (слова разделяются пробелом).

icon