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

Срезы, работа с частями строк

Срезы

Из чего состоит строка с точки зрения компьютера? Это последовательность символов. У строки есть такая характеристика как длинна, она равна количеству символов. Проверка на длину часто используется при проверке правильности введенных данных на сайтах.

>>> 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[:] создаст еще одну точно же такую же строку в памяти. Практическая польза от такой конструкции достаточно ограничена, поэтому чаще всего это знание используется во время собеседования, чтобы дать возможность собеседующему программисту показать свои "блестящие знания".


image image