М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 35
Текст из файла (страница 35)
Например, следующий шаблон извлекает три группы, разделенные символами слеша:>>> match = re.match(‘/(.*)/(.*)/(.*)’, ‘/usr/home/lumberjack’)>>> match.groups()(‘usr’, ‘home’, ‘lumberjack’)Поиск по шаблону реализован в виде чрезвычайно сложного механизма обработки текста, но в языке Python имеется поддержка еще более сложных механизмов, включая возможность обработки естественного языка человеческогообщения.
Впрочем, для этого руководства я и так сказал уже достаточно об обработке строк, поэтому теперь мы перейдем к рассмотрению другого типа.СпискиСписки – это самое общее представление последовательностей, реализованныхв языке Python. Списки – это упорядоченные по местоположению коллекцииобъектов произвольных типов, размер которых не ограничен. Кроме того, в отличие от строк, списки являются изменяемыми – они могут модифицироваться как с помощью операций присваивания по смещениям, так и с помощьюразнообразных методов работы со списками.Операции над последовательностямиПоскольку списки являются последовательностями, они поддерживают всеоперации над последовательностями, которые обсуждались в разделе, посвященном строкам.
Единственное отличие состоит в том, что результатом такихопераций являются списки, а не строки. Например, для списка, состоящего изтрех элементов:>>> L = [123, ‘spam’, 1.23] # Список из трех объектов разных типов>>> len(L)# Число элементов в списке3Мы можем обращаться к элементам списка по их индексам, получать срезыи так далее, точно так же, как и в случае со строками:>>> L[0]123# Доступ к элементу списка по его индексу>>> L[:-1][123, ‘spam’]# Операция получения среза возвращает новый список>>> L + [4, 5, 6] # Операция конкатенации также возвращает новый список[123, ‘spam’, 1.23, 4, 5, 6]134Глава 4. Введение в типы объектов языка Python>>> L# Наши действия не привели к изменению оригинального списка[123, ‘spam’, 1.23]Методы, специфичные для типаСписки в языке Python являются аналогом массивов в других языках программирования, но они обладают более широкими возможностями.
С однойстороны, они не ограничены одним типом элементов, например, только чторассмотренный список содержит три элемента совершенно разных типов (целоечисло, строку и вещественное число). Кроме того, размер списков не ограничен,благодаря чему они могут увеличиваться и уменьшаться по мере необходимости в результате выполнения операций, характерных для списков:>>> L.append(‘NI’) # Увеличение: в конец списка добавляется новый объект>>> L[123, ‘spam’, 1.23, ‘NI’]>>> L.pop(2)1.23# Уменьшение: удаляется элемент из середины списка>>> L# Инструкция “del L[2]” также удалит элемент списка[123, ‘spam’, ‘NI’]В данном примере метод append увеличивает размер списка и вставляет в конецновый элемент.
Метод pop (или эквивалентная ему инструкция del) удаляет изсписка элемент с заданным смещением, что приводит к уменьшению списка.Другие методы списков позволяют вставлять новые элементы в произвольноеместо списка (insert), удалять элемент, заданный значением (remove), и так далее. Так как списки являются изменяемыми, большинство методов списков несоздают новый список, а изменяют оригинальный список:>>> M = [‘bb’, ‘aa’, ‘cc’]>>> M.sort()>>> M[‘aa’, ‘bb’, ‘cc’]>>> M.reverse()>>> M[‘cc’, ‘bb’, ‘aa’]Метод sort, использованный в этом примере, по умолчанию упорядочивает элементы списка по возрастанию, а метод reverse – по убыванию. В обоих случаяхпроисходит непосредственное изменение самого списка.Проверка выхода за границыХотя списки не имеют фиксированного размера, язык Python, тем не менее, недопускает возможности обращаться к несуществующим элементам списка.
Обращение к элементам списка по индексам, значения которых выходят за пределы списка, всегда является ошибкой:>>> L[123, ‘spam’, ‘NI’]>>> L[99]...текст сообщения об ошибке опущен...IndexError: list index out of range135Списки>>> L[99] = 1... текст сообщения об ошибке опущен...IndexError: list assignment index out of rangeВ этом примере я специально допустил ошибку (особенно неприятную в языкеC, который не выполняет проверку выхода за границы массива, как Python)и попытался выполнить присваивание за пределами списка. Вместо того чтобы увеличить размер списка, интерпретатор Python сообщил об ошибке.
Чтобыувеличить список, необходимо воспользоваться таким методом, как append.Вложенные спискиОдна из замечательных особенностей базовых типов языка Python состоитв том, что они поддерживают возможность создания вложенных конструкцийпроизвольной глубины и в любых комбинациях (например, можно создатьсписок, содержащий словарь, который содержит другой список, и так далее).Одно из очевидных применений этой особенности – представление матриц, или«многомерных массивов» в языке Python.
Делается это с помощью списка, содержащего вложенные списки:>>> M = [[1, 2, 3], # Матрица 3 x 3 в виде вложенных списков[4, 5, 6], # Выражение в квадратных скобках может[7, 8, 9]] # занимать несколько строк>>> M[[1, 2, 3], [4, 5, 6], [7, 8, 9]]Здесь мы реализовали список, состоящий из трех других списков. В результате была получена матрица чисел 3 x 3.
Обращаться к такой структуре можноразными способами:>>> M[1][4, 5, 6]# Получить строку 2>>> M[1][2] # Получить строку 2, а затем элемент 3 в этой строке6Первая операция в этом примере возвращает вторую строку целиком, а вторая – третий элемент в этой строке. Соединение операций индексированияпозволяет все дальше и дальше погружаться вглубь вложенной структурыобъектов.1Генераторы списковПомимо обычных операций над последовательностями и методов списковPython предоставляет возможность выполнять более сложные операции над1Такая организация матриц вполне пригодна для решения небольших задач, но дляреализации более сложных программ числовой обработки информации желательноиспользовать специализированные расширения, например NumPy.
Такого рода инструменты позволяют хранить и обрабатывать матрицы намного эффективнее, чемтакая структура, реализованная в виде вложенных списков. Как уже говорилось,расширение NumPy превращает Python в свободный и более мощный эквивалентсистемы MatLab, и такие организации, как NASA, Los Alamos и JPMorgan Chase,используют его для решения научных и финансовых задач. Дополнительную информацию об этом расширении вы без труда найдете в Сети.136Глава 4. Введение в типы объектов языка Pythonсписками, известные как выражения генераторов списков (list comprehensionexpression), которые представляют эффективный способ обработки такихструктур, как приведенная в примере матрица. Предположим, например, чтонам требуется извлечь из нашей матрицы второй столбец. Строку легко можнополучить, выполнив операцию индексирования, потому что матрица хранится в виде строк, однако, благодаря генераторам списков, получить столбец ничуть не сложнее:>>> col2 = [row[1] for row in M] # Выбирает элементы второго столбца>>> col2[2, 5, 8]>>> M# Матрица не изменилась[[1, 2, 3], [4, 5, 6], [7, 8, 9]]Генераторы списков следуют традиции системы представления множеств; онипозволяют создавать новые списки, выполняя выражение для каждого элемента в последовательности, по одному за раз, слева направо.
Генераторы списковзаключены в квадратные скобки (чтобы отразить тот факт, что они создаютсписок) и составлены из выражения и конструкции цикла, которые используют одно и то же имя переменной (в данном случае row). В предыдущем примерегенератор списков интерпретируется так: «Получить элементы row[1] из каждой строки матрицы M и создать из них новый список». Результатом являетсяновый список, содержащий значения из второго столбца матрицы.На практике генераторы списков могут приобретать еще более сложную форму:>>> [row[1] + 1 for row in M] # Добавить 1 к каждому элементу в столбце 2[3, 6, 9]>>> [row[1] for row in M if row[1] % 2 == 0] # отфильтровать нечетные значения[2, 8]Первая операция в этом примере прибавляет 1 к значениям всех отобранныхэлементов, а вторая использует условный оператор if для исключения из результата нечетных чисел с помощью операции деления по модулю – % (остатокот деления).