Срезы, работа с частями строк
Срезы
Из чего состоит строка с точки зрения компьютера? Это последовательность символов. У строки есть такая характеристика как длинна, она равна количеству символов. Проверка на длину часто используется при проверке правильности введенных данных на сайтах.
>>> hi = "Привет, Земля!"
>>> len(hi)
14
Если мы хотим узнать в каком месте находится какой-то символ, то мы можем обратиться к нему как к элементу списка:
>>> hi[0]
'П'
>>> hi[1]
'р'
Обратите внимание, что в программировании традиционно счет начинается с 0. Поэтому первая буква переменной hi доступна по адресу 0.
Строки и списки
С точки зрения Python строка очень похожа на список list. Потому что можно обратиться к каждому символу по его адресу.
Выражение, которое находится внутри квадратных скобок называется срез. Правило построения среза выглядят так:
[Начало:Конец:Шаг]
Причем в такой записи можно пропускать элементы, что будет обозначать отсутствие условия. Если какое-то условие пропущено, значит использовать его логичное значение по умолчанию. Например, если не указать какой отступ сделать с начала строки, то отсчет будет с первого символа, а если не указать конец, то до конца строки. Логично, что шаг по умолчанию 1, то есть использовать каждый первый символ.
Например, можно написать [0:6] и это будет обозначать, что надо получить символы с 0 до 6 (включительно!). То же самое можно записать как [:6] или [0:6:1].
>>> hi = "Привет, Земля!"
>>> hi[0:6]
'Привет'
Если мы укажем шаг 3, то вернется только первый из каждых трех символов в диапазоне от 0 до 6.
>>> "Привет, Земля!"[0:6:3]
'Пв'
Можно использовать отрицательные значения, это будет обозначать отчет с конца строки.
>>> "Привет, Земля!"[-6:-1]
'Земля'
Вот наглядная таблица индексов символов в строке:
| Строка | П | р | и | в | е | т |
|---|---|---|---|---|---|---|
| Индекс с начала | [0] | [1] | [2] | [3] | [4] | [5] |
| Индекс с конца | [-6] | [-5] | [-4] | [-3] | [-2] | [-1] |
Указание шага без начала и конца тоже допустимо и так же работают отрицательные значения.
>>> "Привет, Земля!"[::2]
'Пие,Змя'
>>> "Привет, Земля!"[::-1]
'!ялмеЗ ,тевирП'
Или можно опустить вообще все значения:
>>> "Привет, Земля!"[:]
'Привет, Земля!'
>>> "Привет, Земля!"[::]
'Привет, Земля!'
Память
Использование среза создает абсолютно новую строку в памяти, а не ссылку на область старой. Вообще строки в Python неизменные. Даже присвоение старой строковой переменной нового значения просто создает еще одну новую область в памяти и дает старому идентификатору переменной на нее ссылку. Поэтому вызов строки со срезом s[:] создаст еще одну точно же такую же строку в памяти. Практическая польза от такой конструкции достаточно ограничена, поэтому чаще всего это знание используется во время собеседования, чтобы дать возможность собеседующему программисту показать свои "блестящие знания".
