Питон: работа со срезами
В Python срезы (slices) позволяют получить доступ к части последовательности (строки, списка, кортежа и т.д.) без изменения оригинального объекта. Срезы строятся на основе индексов элементов, начиная с нуля.
Синтаксис среза выглядит следующим образом:
sequence[start:stop:step]
где:
- `start` - индекс начального элемента среза. Если не указан, то считается, что он равен 0
- `stop` - индекс конечного элемента среза (не включая его). Если не указан, то считается, что он равен длине последовательности
- `step` - шаг среза. Если не указан, то считается, что он равен 1
Например, если у нас есть строка `"Hello, world!"`, то с помощью среза мы можем получить подстроки:
python
s = "Hello, world!"
print(s[0:5]) # выведет "Hello"
print(s[7:12]) # выведет "world"
print(s[:5]) # выведет "Hello". Эквивалентно s[0:5]
print(s[7:]) # выведет "world!". Эквивалентно s[7:len(s)]
print(s[::2]) # выведет "Hlo ol!"
Обратите внимание, что если индексы превышают границы последовательности, то это не приводит к ошибке:
python
s = "Hello, world!"
print(s[15:19]) # выведет ""
print(s[10:100])# выведет "ld!"
Также можно использовать отрицательные индексы, которые считаются от конца последовательности:
python
s = "Hello, world!"
print(s[-6:-1]) # выведет "world"
Срезы могут применяться не только к строкам, но и к другим последовательностям, например, к спискам. В этом случае результатом среза будет новый список:
python
a = [1, 2, 3, 4, 5, 6]
print(a[1:4]) # выведет [2, 3, 4]
print(a[2:]) # выведет [3, 4, 5, 6]
Важно помнить, что срез создает новый объект, но не изменяет исходную последовательность:
python
s = "Hello, world!"
s[7:12] = "Python" # ошибка, строка неизменяемый тип данных
Однако, можно изменить содержимое списка, используя срез:
python
a = [1, 2, 3, 4, 5, 6]
a[1:4] = [7, 8, 9]
print(a) # выведет [1, 7, 8, 9, 5, 6]
Также необходимо учитывать, что при использовании отрицательных индексов `start` должен быть меньше `stop`, в противном случае срез будет пустым:
python
s = "Hello, world!"
print(s[-1:-6]) # выведет ""
print(s[-6:-1]) # выведет "world"
В Python есть возможность использовать расширенный синтаксис срезов, который позволяет указывать несколько срезов через запятую:
sequence[start1:stop1:step1, start2:stop2:step2, ...]
Такие срезы будут возвращать кортеж элементов, полученных из соответствующих срезов:
python
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(a[1:3, 0:2]) # выведет [[4, 5], [7, 8]]
Таким образом, срезы в Python очень удобны для работы с последовательностями и позволяют получать нужные подстроки или подсписки, не изменяя исходный объект.