Лутц М. - Изучаем Python (1077325), страница 48
Текст из файла (страница 48)
'Кп ', 'хп '] »> 3 1п [1, 2, 3) Тгцв »> Гог х гп [1, 2, 3): рг1п1 х, № Длина № Конкатенация № Повторение № Проверка на вхоидвниа № Обход в цикле На практике в текстах программ обработки списков вы нечасто встретите списки, заданные подобным образом. Чаще вам будет встречаться программный код, обрабатывающий списки, которые создаются динамически (во время выполнения).
Несмотря на всю важность владения синтаксисом литералов, следует иметь в виду, что большая часть структур данных в языке Рув)гоп конструируется во время выполнения программы. Списки, как и строки, поддерживают операторы + и * — для списков они так же соответствуют операции конкатенации и повторения, но в результате получается новый список, а не строка. Фактически списки поддерживают все общие операции над последовательностями, которые мы рассматривали применительно к строкам в предыдущей главе. 219 Списки в действии 123 Подробнее об операции обхода элементов списка в цикле Рог и о встроенной функции гапОе мы поговорим в главе 13, потому что они имеют отношению к синтаксису инструкций.
Говоря вкратце, оператор цикла гог выбирает элементы последовательности в порядке слева направо и выполняет одну или более инструкций для каждого из них. Последняя строка в табл. 8. 1 — это одна из дополнительных операций над списками, которые описываются в главе 13 и расширенное обсуждение которых приводится в главе 17.
Как говорилось в главе 4, они представляют собой способ построить список, применяя выражение к каждому элементу последовательности, единственной инструкцией. Несмотря на то, что оператор + со списками работает точно так же, как и со строками, очень важно знать, что с обеих сторон оператора должны находиться последовательности одного и того же типа, в противном случае во время работы программного кода вы получите сообщение об ошибке.
Например, нельзя выполнить операцию конкатенации для списка и строки, если предварительно не преобразовать список в строку (используя, например, обратные апострофы (Ьас]ос[по[ее), функцию 31г или 'гь -форматирование) или строку в список (с помощью встроенной функции 1131): »> атг([1, 2]) + "34" № то ве, что и Т1, 2]" + "34" '[1, 2]34' »> [1, 2] + 1[вт("34") № )о ве, что и 11, 2] ч ("3", "4"] [1, 2, '3', '4'] Индексы, срезы и матрицы Так как списки являются последовательностями, операции доступа к элементам по индексам и извлечения срезов работают точно так же, как и в случае со строками. Однако, в результате обращения к элементу по индексу возвращается объект, который расположен по указанному смещению, а в результате операции извлечения среза возвращается новый список: »> С = ['вращ', 'Вращ', '3РАМ1'] »> Ц2] № Отсчет сиещений начинается с нуля '3РАМ'' »> Ц-2] № Отрицательное сиещение: отсчитывается справа '3рав' »> [[1:] № Операция извлечения среза возвращает разделы списка ['3ращ', '3РАМ'.'] Здесь следует отметить следующее: поскольку списки (и объекты других типов) могут быть вложены в другие списки, иногда бывает необходимо объединять в цепочку несколько индексов, чтобы получить доступ к элементам на более глубоком уровне вложенности в структуре данных.
Например, один из простейших способов представления Глава 8. Списки и словари гго матриц (многомерных массивов) в языке Рус]топ заключается в использовании вложенных списков. Ниже приводится пример двухмерного массива размером ЗхЗ, построенного на базе списков: »> ща1г1х = П1, 2, 33, [4, 5, 63, [7, 6, 9]] С помощью первого индекса извлекается целая строка (в действительности — вложенный список), а с помощью второго извлекается элемент этой строки: »> ща1г1х[13 [4, 5, 6] »> ща1г[х[1П1] 5 »> щасг[х[2ПО] 7 »> щасг1х = [[1, 2, 83, [4, 5, 6), [7, 8, 9]1 »> ща1г[х[1П1] 5 Обратите внимание на то, что, как показано в предыдущем примере, список может быть при необходимости растянут на несколько строк, ограниченных квадратными скобками (подробнее о синтаксисе будет говориться в следующей части книги).
Далее в этой главе вы также увидите матрицы, реализованные на базе словарей. Модуль ХигпРу, упомянутый в главе б, для высокопроизводительной работы с числовыми данными предоставляет другие способы организации матриц. Изменениесписка Списки относятся к категории изменяемых объектов, поэтому они поддерживают операции, которые изменяют сам список невосредслтвенно.
То есть все операции, представленные в этом разделе, изменяют сам список объектов и не приводят к необходимости создавать новую копию, как это было в случае со строками. В языке РуФ]1оп приходится иметь дело только со ссылками на объекты, что обусловливает существенные различия между непосредственным изменением объекта и созданием нового объекта — как обсуждалось в главе 6, непосредственное изменение объекта может отражаться более чем на одной ссылке. Г]рисваивание по индексам и сревам при использовании списков существует воэможность изменять их содержимое, выполняя присваивание значений элементам (по смещению) или целым разделам (срезам) списка: »> С = ['аращ', 'зращ', '5РЯВ~'] »> Ц1] = 'азза' а Лрмсвамванме по индексу элемента »> ['эрам', 'ессэ, 5РЯМ!'] гг1 Списки в действии »> 1[0:2] ('еат', 'аоге') р присваиевнив срезу: удаление«вставке »> В Элеиенты 0 и 1 были звиенены ['еат', аоге, ЯРАИ! ] Обе операции присваивания — и отдельному элементу, и срезу — производятся непосредственно в списке — они изменяют сам список, а не создают новый список объектов.
Операция присваивания по индексу в языке Ру(]топ работает практически так же, как в языке С и во многих других языках программирования: интерпретатор замещает старую ссылку на объект в указанном смещении на новую. Присеаиеание срезу, последняя операция в предыдущем примере, замещает целый раздел списка за один прием. Поскольку это довольно сложная операция, проще будет представить ее как последовательное выполнение двух действий: 1. Удаление. Раздел списка, определяемый слева от оператора =, удаляется.
2. Вставка. Новые элементы, содержащиеся в объекте, расположенном справа от оператора =, вставляются в список, начиная с левого края, где находился прежний удаленный срез. В действительности это не совсем то, что происходит на самом деле, но это достаточно точно объясняет, почему число вставляемых элементов не должно соответствовать числу удаляемых элементов. Например, представим, что список 1 имеет значение [1, 2, 3], тогда в результате операции присваивания с[1:2]=[4,5] будет получен список [1,4,5,3].
Интерпретатор сначала удалит 2 (срез, состоящий из одного элемента), а затем, начиная с позиции удаленного элемента 2, вставит элементы 4 и 5. Это также объясняет, почему операция [[1: 2]=[] в действительности является операцией удаления, — интерпретатор удалит срез (элемент ео смещением 1) и затем вставит пустой список. В результате операция присваивания срезу замещает целый раздел списка, или «столбец», за одно действие. Поскольку длина последовательности справа от оператора = не должна обязательно соответствовать длине среза, которому выполняется присваивание, эта операция может использоваться для замены (посредством перезаписи), расширения (посредством вставки) или сжатия (посредством удаления) требуемого списка.
Это довольно мощная операция, но, честно говоря, она достаточно редко используется на практике. Обычно используются более простые способы замены, вставки и удаления (например, операция конкатенация и методы списков ]пввгт, рор и геаоце), которые программисты предпочитают использовать на практике. Методы списков Как и строки, объекты списков в языке Ру(]топ поддерживают специ- фичные методы: »> 1.аррепб('р)вазе') в Вызов иетодв добавлении элемента в конец слискв »> 222 Глава 8.
Списки и словари [ Еа1', 'аОгс', 'БРАМ. '', 'р1ЕаЭЕ'] »> [.эоггО Ф сортировка элеиентав списка ['Б' < 'е') »> ['БРАМ~ ', еа1', 'логе', 'р1еаэе'] Методы были представлены в главе 7. Коротко напомню, что методы— это функции (в действительности — атрибуты, ссылающиеся на функции), которые связаны с определенным типом объектов. Методы обеспечивают выполнение специфических операций, например, методы списков, представленные здесь, доступны только для списков. О В Ру(Ьоп версии 2.5 и более ранних сравнение выполняется поразному для объектов разных типов (например, списков и строк)— язык определяет способ упорядочения различных типов, который является детерминистским и не всегда может выглядеть правильным, Этот способ упорядочения основан на именах типов, вовлеченных в операцию сравнения, например, любые целые числа всегда меньше любых строк, потому что строка "Чпп' меньше, чем строка "э)г". При выполнении операции сравнения никогда не выполняется преобразование типов объектов, за исключением сравнения объектов числовых типов.
В Рус)топ 3.0 такой порядок, возможно, будет изменен: планируется, что в случае попытки сравнения объектов различных типов вместо прежнего способа упорядочения будет возбуждаться исключение. Так как метод сортировки использует операцию сравнения, это означает, что инструкция [1, 2, 'эраа'].эсгг() будет успешно выполнена в РуФЬоп 2.5, но будет возбуждать исключение в РХФЬоп 3.0.
За дополнительной информацией обращайтесь к примечаниям к выпуску Руслоп 3.0. В отличие от операции конкатенации (т), метод аррепс не создает новый объект, поэтому обычно он выполняется быстрее. Существует возможность имитировать работу метода аррепс с помощью операции присваивания срезу: выражение [[1еп( [): ]=[Х] соответствует вызову с.
аррепп(Х), а выражение [[; 0]=[Х] соответствует операции добавления в начало списка. В обоих случаях удаляется пустой сегмент списка и вставляется элемент Х, при этом изменяется сам список [, так же быстро, как при использовании метода аррепс. Наиболее часто используемым методом, пожалуй, является метод аррепб, который просто добавляет единственный элемент (ссылку на объект) в конец списка. В отличие от операции конкатенации, метод аррепб принимает единственный объект, а не список. По своему действию выражение [.
аррепо(Х) похоже на выражение [е[Х], но в первом случае изменяется сам список, а во втором — создается новый список.' Другой часто используемый метод — метод Бог1 — выполняет переупорядочивание элементов в самом списке. По умолчанию он использует стандартные операторы сравнения языка Русаков (в данном случае выполняется сравнение строк) и выполняет сортировку в порядке возрастания значений.
Однако существует возможность передать методу во гг свою собственную функцию сравнения. Списки в действии Важно заметить, что методы аррепб и вогт изменяют сам объект списка и не возвращают список в виде результата (точнее говоря, оба метода возвращают значение йопе).