← Назад к вопросам

К каким типам данных можно применить срез

2.0 Middle🔥 11 комментариев
#FastAPI и Flask#Git и VCS

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

К каким типам данных можно применить срез в 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]
#         ^^^^^ ^^^^ ^^^^
#         с    по   шаг
ПараметрЗначение по умолчаниюОписание
start0Начальный индекс (включительно)
stoplen(sequence)Конечный индекс (исключительно)
step1Шаг перемещения
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)

К каким типам данных можно применить срез | PrepBro