HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Работать с одиночными элементами вы уже умеете. Настало время перейти к очень интересному инструменту, который Python предоставляет для работы с целыми подмножествами элементов списка - срезы (slices).</p>
1 <p>Работать с одиночными элементами вы уже умеете. Настало время перейти к очень интересному инструменту, который Python предоставляет для работы с целыми подмножествами элементов списка - срезы (slices).</p>
2 <h2>Синтаксис срезов</h2>
2 <h2>Синтаксис срезов</h2>
3 <p>Срез записывается так же, как записывается обращение к элементу списка по индексу:</p>
3 <p>Срез записывается так же, как записывается обращение к элементу списка по индексу:</p>
4 <p>У среза три параметра:</p>
4 <p>У среза три параметра:</p>
5 <ul><li>START - индекс первого элемента в выборке</li>
5 <ul><li>START - индекс первого элемента в выборке</li>
6 <li>STOP - индекс элемента списка,<em>перед которым</em>срез должен закончиться. Сам элемент с индексом STOP<em>не будет</em>входить в выборку</li>
6 <li>STOP - индекс элемента списка,<em>перед которым</em>срез должен закончиться. Сам элемент с индексом STOP<em>не будет</em>входить в выборку</li>
7 <li>STEP - шаг выбираемых индексов</li>
7 <li>STEP - шаг выбираемых индексов</li>
8 </ul><p>При этом любой из трех параметров среза может быть пропущен и вместо соответствующего параметра будет значение по умолчанию:</p>
8 </ul><p>При этом любой из трех параметров среза может быть пропущен и вместо соответствующего параметра будет значение по умолчанию:</p>
9 <ul><li>По умолчанию START означает "от начала списка".</li>
9 <ul><li>По умолчанию START означает "от начала списка".</li>
10 <li>По умолчанию STOP означает "до конца списка включительно".</li>
10 <li>По умолчанию STOP означает "до конца списка включительно".</li>
11 <li>По умолчанию STEP означает "брать каждый элемент".</li>
11 <li>По умолчанию STEP означает "брать каждый элемент".</li>
12 </ul><p>Вот несколько примеров с разными наборами параметров:</p>
12 </ul><p>Вот несколько примеров с разными наборами параметров:</p>
13 <ul><li>[:] или [::] - весь список.</li>
13 <ul><li>[:] или [::] - весь список.</li>
14 <li>[::2] - нечетные по порядку элементы.</li>
14 <li>[::2] - нечетные по порядку элементы.</li>
15 <li>[1::2] - четные по порядку элементы.</li>
15 <li>[1::2] - четные по порядку элементы.</li>
16 <li>[::-1] - все элементы в обратном порядке.</li>
16 <li>[::-1] - все элементы в обратном порядке.</li>
17 <li>[5:] - все элементы, начиная с шестого.</li>
17 <li>[5:] - все элементы, начиная с шестого.</li>
18 <li>[:5] - все элементы, не доходя до шестого.</li>
18 <li>[:5] - все элементы, не доходя до шестого.</li>
19 <li>[-2:1:-1] - все элементы от предпоследнего до третьего в обратном порядке. Во всех случаях выборки от большего индекса к меньшему нужно указывать шаг.</li>
19 <li>[-2:1:-1] - все элементы от предпоследнего до третьего в обратном порядке. Во всех случаях выборки от большего индекса к меньшему нужно указывать шаг.</li>
20 </ul><p>Теперь разберем как можно использовать срезы.</p>
20 </ul><p>Теперь разберем как можно использовать срезы.</p>
21 <h2>Выборка элементов</h2>
21 <h2>Выборка элементов</h2>
22 <p>Срезы работают не только со списками, но и с кортежами, и даже со строками. Результатом применения выборки всегда становится новое значение соответствующего типа - список, кортеж, строка:</p>
22 <p>Срезы работают не только со списками, но и с кортежами, и даже со строками. Результатом применения выборки всегда становится новое значение соответствующего типа - список, кортеж, строка:</p>
23 <h2>Присваивание срезу</h2>
23 <h2>Присваивание срезу</h2>
24 <p>В отличие от строк и кортежей списки могут изменяться. Одним из вариантов модификации является присваивание срезу. Срезу с указанным шагом можно присвоить список из новых элементов:</p>
24 <p>В отличие от строк и кортежей списки могут изменяться. Одним из вариантов модификации является присваивание срезу. Срезу с указанным шагом можно присвоить список из новых элементов:</p>
25 <p>Срез [::2] означает, что мы выбираем элементы с шагом 2, то есть берем каждый второй элемент. Список [0, 0, 0] - это список, который мы присваиваем выбранным элементам. Срез l[::2] теперь содержит элементы с индексами 0, 2 и 4 (т.е. 1, 3 и 5). Присваивание [0, 0, 0] этим элементам заменяет их на нули. В результате изменения списка l становится равным [0, 2, 0, 4, 0, 6].</p>
25 <p>Срез [::2] означает, что мы выбираем элементы с шагом 2, то есть берем каждый второй элемент. Список [0, 0, 0] - это список, который мы присваиваем выбранным элементам. Срез l[::2] теперь содержит элементы с индексами 0, 2 и 4 (т.е. 1, 3 и 5). Присваивание [0, 0, 0] этим элементам заменяет их на нули. В результате изменения списка l становится равным [0, 2, 0, 4, 0, 6].</p>
26 <p>Если вы попробуете присвоить срезу с шагом неверное количество элементов, то получите ошибку:</p>
26 <p>Если вы попробуете присвоить срезу с шагом неверное количество элементов, то получите ошибку:</p>
27 <p>Если срез непрерывный, то есть шаг не указан и индексы идут подряд, то свободы нам дается больше. Такому срезу можно присвоить как больше элементов - тогда список вырастет, так и меньше, что приведет к урезанию списка:</p>
27 <p>Если срез непрерывный, то есть шаг не указан и индексы идут подряд, то свободы нам дается больше. Такому срезу можно присвоить как больше элементов - тогда список вырастет, так и меньше, что приведет к урезанию списка:</p>
28 <p>Сначала список растет, потом уменьшается, а под конец вообще становится пустым - и все с помощью компактного, но мощного синтаксиса срезов.</p>
28 <p>Сначала список растет, потом уменьшается, а под конец вообще становится пустым - и все с помощью компактного, но мощного синтаксиса срезов.</p>
29 <h2>Срезы-значения</h2>
29 <h2>Срезы-значения</h2>
30 <p>Хоть срезы и имеют специальную поддержку со стороны синтаксиса, но мы можем создавать и использовать срезы сами по себе - как обычные значения.</p>
30 <p>Хоть срезы и имеют специальную поддержку со стороны синтаксиса, но мы можем создавать и использовать срезы сами по себе - как обычные значения.</p>
31 <p>Значение среза можно сконструировать с помощью функции slice():</p>
31 <p>Значение среза можно сконструировать с помощью функции slice():</p>
32 <p>Функция slice() принимает от одного до трех параметров - те самые START, STOP и STEP. При вызове функции с одним параметром, функция вызывается с параметром STOP.</p>
32 <p>Функция slice() принимает от одного до трех параметров - те самые START, STOP и STEP. При вызове функции с одним параметром, функция вызывается с параметром STOP.</p>
33 <p>Если вы хотите пропустить один из параметров, то подставьте вместо него None. Также None можно использовать и в записи срезов в квадратных скобках - там он так же будет означать пропуск значения.</p>
33 <p>Если вы хотите пропустить один из параметров, то подставьте вместо него None. Также None можно использовать и в записи срезов в квадратных скобках - там он так же будет означать пропуск значения.</p>
34 <p>На месте параметров среза могут быть любые выражения, лишь бы эти выражения вычислялись в целые числа или None.</p>
34 <p>На месте параметров среза могут быть любые выражения, лишь бы эти выражения вычислялись в целые числа или None.</p>
35 <h2>Соотношение START и STOP</h2>
35 <h2>Соотношение START и STOP</h2>
36 <p>В срезе элемент с индексом STOP не включается в результат, в отличие от элемента с индексом START.</p>
36 <p>В срезе элемент с индексом STOP не включается в результат, в отличие от элемента с индексом START.</p>
37 <p>Эту особенность можно использовать, какой бы<em>неотрицательный</em>индекс n мы ни выбрали, для любого списка будет соблюдаться указанное равенство:</p>
37 <p>Эту особенность можно использовать, какой бы<em>неотрицательный</em>индекс n мы ни выбрали, для любого списка будет соблюдаться указанное равенство:</p>
38 <p>Посмотрим на такой пример:</p>
38 <p>Посмотрим на такой пример:</p>
39 <p>Это свойство удобно использовать, когда вы разбираете некий текст. Вам достаточно двигать позицию разрезания строки на начало и остаток, не заботясь, что какая-либо информация на границе разрезания потеряется.</p>
39 <p>Это свойство удобно использовать, когда вы разбираете некий текст. Вам достаточно двигать позицию разрезания строки на начало и остаток, не заботясь, что какая-либо информация на границе разрезания потеряется.</p>