На самом деле в Python строка
представляются как упорядоченная коллекция символов. И ключевое слово здесь –
«упорядоченная». Это значит, что у каждого символа в строке есть свой
порядковый номер – индекс, по которому мы можем его получить. Например, когда
мы создаем строку
то формируется
следующая коллекция:
Каждый символ
имеет свой индекс, начиная с нулевого. Первый символ в Python всегда имеет
нулевой индекс.
Для обращения к
тому или иному символу используется следующий синтаксис:
<строка>[<индекс>]
Например:
и так далее. Но,
если указать неверный индекс, например:
то возникнет
ошибка. Поэтому здесь следует быть аккуратным и не выходить за пределы этого
списка. В частности, последний «рабочий» индекс можно определить с помощью
функции len – длины строки:
lastIndex = len(<строка>)
– 1
То есть, к
последнему индексу мы можем обратиться так:
Но это не очень
удобно. Поэтому разработчики языка Python решили, что
отрицательные индексы будут означать движение по строке с конца в начало. И
предыдущую запись можно переписать так:
Видите? Это
намного удобнее. То есть, у строк есть еще такие отрицательные индексы:
Также в Python можно
использовать доступ к отдельному символу непосредственно у строкового литерала:
Иногда это
бывает удобно.
Срезы
Часто в программировании
требуется выбрать не один какой-то символ, а сразу несколько. Для этого
используются так называемые срезы. Их работу проще показать на конкретных
примерах. Пусть у нас есть наша строка:
и мы хотим
выделить последнее слово «World!». Для этого в квадратных скобках
указывается начальный индекс и через двоеточие – конечный. Если мы запишем все
вот в таком виде:
то получим
результат «World» без
восклицательного знака. Дело в том, что последний индекс исключается из
интервала, то есть, интервал определяется как
[6: 11)
Поэтому, мы
должны записать срез так:
Другой пример
для выделения символов «llo»:
и так далее. В Python допускается не
указывать начальное или конечное значения, или даже, оба из них. Например:
выделяет слово «Hello», а вот так:
получим «World!». Наконец,
записав все в таком виде:
получим ту же
самую строку, не копию! Это можно проверить так:
copy = msg[:]
print(id(copy), id(msg))
Увидим одно и то же значение id для обеих переменных, это означет, что они ссылаются на один и тот же объект.
В срезах на Python можно
дополнительно указывать шаг через двоеточие. Например, так:
мы здесь ставим
еще одно двоеточие и указываем шаг 2, то есть, идем через символ: «HloWrd». Также
это можно комбинировать с граничными значениями:
msg[:5:2]
msg[6::2]
msg[1:6:2]
и использовать
отрицательный шаг:
в этом случае
символы будут перебираться в обратном порядке.
Строка – неизменяемый объект
Далее, при
работе со строками следует помнить, что это неизменяемый объект, то есть, мы не
можем изменять в строковом объекте уже существующие символы, то есть, вот такая
запись:
приведет к
ошибке, говорящая о том, что строка не может быть изменена. Тогда как в 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. Разделите
введенное с клавиатуры предложение на слова (слова разделяются пробелом).