Все, що Ви хотіли знати про слайси

Маленький вступ. Впевнений, що кожен, хто використовував пітон деякий час, полюбив вирази у прямокутних дужках. У цій статті я хочу від "а" до "я" розповісти про зрізи. Спочатку трохи про термінологію: в англійській мові їх називають «slice». Я називатиму їх то «слайсами», то «зрізами», як у моєму розумінні цього слова. Все вчитимемося на прикладах. Для мене такий метод був би найзручнішим, найшвидшим і найпростішим. Для початку, найпоширеніше застосування. Створення копії послідовності чи її частини. Розглянемо зріз як частину послідовності. Наприклад, кілька зрізів зі списку:

Це ще не все, Далеко не всі знають, але можуть бути слайси з трьома параметрами:

Всі ці дії можна провертати з рядками, кортежами та списками.

Зовсім забув, дякую xeningem:

Але це ще не все, є кілька дій зі зрізами, які можна робити тільки зі списками (ну, майже). Справа в тому, що вони єдині з базових послідовностей, які можуть змінюватися, і для яких має значення порядок (не можна робити зрізи зі словників і множин/наборів). Далі йтиметься розмова про зрізи, які змінюють послідовність. Слайси можна видаляти, наприклад:

Ще можна вставляти елементи: У варіанті заміни:

Ну, або варіант вставки простіше:

Якщо хочемо створити клас, з якого можна знімати зрізи? Простіше нікуди, для цього є два шляхи: Неправильний: 1) Перевизначити функції __getslice__, __delslice__ та __setslice__. Але це застарілий метод (в 2.0 позначений як deprecated) І правильний: 2) Перевизначити __getitem__, __setitem__ і __delitem__. З першого погляду все здається гранично простим, але якщо придивитися, то __getitem__(self, key) - отримує лише одинпараметр, key, а у зрізу у нас може бути цілих 3 числа… Все дуже просто: у випадку, коли хтось намагається зрізати шматочок від нашого об'єкта, значенням key функція отримає об'єкт типу slice:

Звичайно, приклад дуже символічний, але зрозуміти можна: об'єкт класу slice має три властивості: start, stop і step, відповідають числам з дужок зрізу. Потрібно бути уважним, якщо число пропущено, то значення буде None, наприклад [::] буде slice(None, None, None), а [:-3] буде slice(None, -3, None). Заміну/вставку та видалення зрізів робимо за аналогією. Як вправу можете спробувати перевантажити словник, щоб з нього можна було робити зрізи. У пітоні3 це буде починатися як class SliceableDict(dict): Ну, начебто все, що є про зрізи. Якщо пропустив із задоволенням вивчу і допишу.

А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»