К каким типам данных можно применить срез
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
К каким типам данных можно применить срез в Python
Срез (slice) — мощный механизм Python для извлечения подпоследовательности из упорядоченных объектов. Это одна из фишек, которая отличает Python от многих других языков.
Типы, поддерживающие срезы
1. Строки (str) — ОСНОВНОЙ тип
Строки в Python — это неизменяемые последовательности символов.
s = "Hello, Python!"
print(s[0:5]) # "Hello" — символы с индекса 0 по 4
print(s[7:]) # "Python!" — с 7-го символа до конца
print(s[:-1]) # "Hello, Python" — всё кроме последнего
print(s[::2]) # "Hlo yhn!" — каждый 2-й символ
print(s[::-1]) # "!nohtyP ,olleH" — разворот строки
2. Списки (list) — ОСНОВНОЙ тип
Списки — самый частый тип для работы со срезами.
nums = [10, 20, 30, 40, 50, 60]
print(nums[1:4]) # [20, 30, 40] — элементы с индекса 1 по 3
print(nums[:3]) # [10, 20, 30] — первые три элемента
print(nums[2:]) # [30, 40, 50, 60] — со 2-го элемента до конца
print(nums[::2]) # [10, 30, 50] — каждый 2-й элемент
print(nums[::-1]) # [60, 50, 40, 30, 20, 10] — разворот
# Важно: срез возвращает НОВЫЙ список
sublist = nums[1:4]
sublist.append(999)
print(nums) # [10, 20, 30, 40, 50, 60] — оригинал не изменился
3. Кортежи (tuple) — ОСНОВНОЙ тип
Кортежи, как и строки, неизменяемы, но также поддерживают срезы.
tuple_data = (1, 2, 3, 4, 5)
print(tuple_data[1:3]) # (2, 3)
print(tuple_data[::2]) # (1, 3, 5)
print(tuple_data[::-1]) # (5, 4, 3, 2, 1)
# Как и со строками, срез возвращает новый кортеж
4. Диапазоны (range)
Объекты range — это ленивые последовательности целых чисел.
r = range(10) # 0, 1, 2, ..., 9
print(r[2:5]) # range(2, 5) — новый range
print(list(r[2:5])) # [2, 3, 4]
Какие типы НЕ поддерживают срезы
❌ Словари (dict) — НЕ поддерживают
d = {"a": 1, "b": 2, "c": 3}
print(d[0:2]) # TypeError: indices must be integers or slices, not str
# Вместо этого используй:
keys = list(d.keys())[0:2] # Срез по ключам через list
❌ Множества (set) — НЕ поддерживают
s = {1, 2, 3, 4, 5}
print(s[1:3]) # TypeError: indices must be integers or slices, not str
# Множество неупорядочено, поэтому срез не имеет смысла
❌ Целые числа (int) — НЕ поддерживают
n = 12345
print(n[1:3]) # TypeError
Синтаксис срезов: [start:stop:step]
sequence[start:stop:step]
# ^^^^^ ^^^^ ^^^^
# с по шаг
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
start | 0 | Начальный индекс (включительно) |
stop | len(sequence) | Конечный индекс (исключительно) |
step | 1 | Шаг перемещения |
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(data[2:7:2]) # [2, 4, 6] — с индекса 2 до 7, шаг 2
print(data[::3]) # [0, 3, 6, 9] — каждый 3-й элемент
print(data[-4:-1]) # [6, 7, 8] — последние 4 элемента (кроме последнего)
Срезы для пользовательских классов
Тебе можно реализовать поддержку срезов в своём классе, определив метод __getitem__:
class CustomSequence:
def __init__(self, data):
self.data = data
def __getitem__(self, key):
if isinstance(key, slice):
return CustomSequence(self.data[key])
return self.data[key]
def __repr__(self):
return f"CustomSequence({self.data})"
cs = CustomSequence([10, 20, 30, 40, 50])
print(cs[1:4]) # CustomSequence([20, 30, 40])
Резюме
Срезы работают с:
✓ Строки (str)
✓ Списки (list)
✓ Кортежи (tuple)
✓ Диапазоны (range)
✓ Байты (bytes)
✓ Пользовательские классы (если реализован __getitem__)
Срезы НЕ работают с: ✗ Словари (dict) ✗ Множества (set) ✗ Целые числа (int) ✗ Генераторы (generator)