Лутц М. - Изучаем Python (1077325), страница 27
Текст из файла (страница 27)
Если такая подстрока будет найдена, части ее, соответствующие шаблону, заключенному в круглые скобки, будут доступны в виде групп. Например, следующий шаблон извлекает три группы, разделенные символами олеша: »> ввссП = ге.ватсп('/(. ° )/(. )/(. ° )', '/свг/Нове/1сваег)асК') >» васса.ргоорв() ('нег', 'Нове', '1ивоег)асК') Поиск по шаблону реализован в виде чрезвычайно сложного механизма обработки текста, но в языке РуФ)гоп имеется поддержка еще более сложных механизмов, включая возможность обработки естественного языка человеческого общения. Впрочем, для этого руководства я и так сказал уже достаточно об обработке строк, поэтому теперь мы перейдем к рассмотрению другого типа.
Списки Списки — это самое общее представление последовательностей, реализованных в языке Ру()1оп. Списки — это упорядоченные по местоположению коллекции объектов произвольных типов, размер которых не ограничен. Кроме того, в отличие от строк, списки являются изменяемыми — они могут модифицироваться как с помощью операций присваивания по смещениям, так и с помощью разнообразных методов работы со списками. Глава 4. Введение в типы объектов языка Рубзоп Операции над последовательностями Поскольку списки являются последовательностями, они поддерживают все операции над последовательностями, которые обсуждались в разделе, посвященном строкам.
Единственное отличие состоит в том, что результатом таких операций являются списки, а не строки. Например, для списка, состоящего из трех элементов: »> ь = [123, 'враз', 1.23] № Список из трех обьектов разных типов »> 1еп(ь) № Число элементов в списке 3 Мы можем обращаться к элементам списка по их индексам, получать срезы и т.
д., точно так же, как и в случае со строками: »> ЦО) 123 № доступ к злеиенту списка по его индексу »> ([:-1] № Операция полу~ения среза возвравает повий список [ 123. 'зрав'] »> ( + [4, 5, б] № Операция конкатенации такие аозвравает навий список [ 123, ' зрав ', 1. 23, 4, 5, б ] »> № Наши действия не привели к изменению оригинального списка [ 123, 'враз', 1.23] Методы, специфичные для типа Списки в языке Руб[зоп являютея аналогом массивов в других языках программирования, но они обладают более широкими возможностями.
С одной стороны, они не ограничены одним типом элементов, например, только что рассмотренный список содержит три элемента совершенно разных типов (целое число, строку и число с плавающей точкой). Кроме того, размер списков не ограничен, благодаря чему онн могут увеличиваться и уменьшаться по мере необходимости в результате выполнения операций, характерных для списков: »> ы вррепб('М1') № увеличение: в конец списка добавляется новой обьект »> [123. 'врвш'. 1 23.
'М1'] »> ы рор(г) 1. 23 № Уиеньшение' удаляется элеиент из середним списка »> № инструкция "бе) ((2>" такие удалит злеиент списка [123, зраш, И1' ] В данном примере метод ар репе увеличивает размер списка и вставляет в конец новый элемент. Метод рср (или эквивалентная ему инструкция бе]) удаляет из списка элемент с заданным смещением, что приводит к уменьшению списка. Другие методы списков позволяют вставлять новые элементы в произвольное место списка (зпзег1), удалять элемент, заданный значением (геаоче), и т.
д. Так как списки являются Списки изменяемыми, большинство методов списков не создают новый список, а изменяют оригинальный список: »> И ['ЬЬ', 'аа', 'сс') »> И.аогг() »> Н ['аа', 'ЬЬ', 'сс') >» И. геувгае() »> Н ['сс', 'ЬЬ', 'аа Ч Метод аогс, использованный в этом примере, по умолчанию упорядочивает элементы списка по возрастанию, а метод геуегае — по убыванию.
В обоих случаях происходит непосредственное изменение самого списка. Проверка выхода за границы Хотя списки не имеют фиксированного размера, язык Ру1Ьоп все равно не допускает возможности обращаться к несуществующим элементам списка. Обращение к элементам списка по индексам, значения которых выходят за пределы списка, всегда является ошибкой: »> (123, 'пращ', 'И1') >» Ц99) ... текст сообщения об ошибке опущен... 1пбехЕггог: 11ас 1псех оос от тапсе >» ((99) = 1 твист сообщения об ошибке опущен... 1поехеггог: 1[вт аввтрпшеп1 1поех оцт ог гансе В этом примере я специально допустил ошибку (особенно неприятную в языке С, который не выполняет проверку выхода за границы массива, как РуЬЬоп) и попыталея выполнить присваивание за пределами списка.
Вместо того, чтобы увеличить размер списка, интерпретатор Ру(Ьоп сообщает об ошибке. Чтобы увеличить список, необходимо воспользоваться таким методом, как аррепб. Вложенные списки Одна из замечательных особенностей базовых типов языка РуЬЬоп состоит в том, что они поддерживают возможность создания вложенных конструкций произвольной глубины и в любых комбинациях (например„можно создать список, содержащий словарь, который содержит другой список, и т. д.). Одно из очевидных применений этой особенности — представление матриц, или в многомерных массивов в в языке РуЬЬоп.
Делаетея это с помощью списка, содержащего вложенные списки: »> Н ((1, 2, 3). Ф Натрица Зхб в виде впокенних списков [4 5 6) 126 Глава 4. Введение з типы объектов языка Рут[зоп [7, 8, Я)] »> Н [[1, 2, 3], [4, 5, 8], [7, 8, 9]] Здесь мы реализовали список, состоящий из трех других списков. В результате была получена матрица чисел ЗхЗ.
Обращаться к такой структуре можно разными способами: »> Н[1] № Получить строку 2 [4, 5, б) »> Н[1Ц2] № Получить строку 2, а затеи элеиент 3 в этой строке б Первая операция в этом примере возвращает вторую строку целиком, а вторая — третий элемент в этой строке. Соединение операций индексирования позволяет все дальше и дальше погружаться вглубь вложенной структуры объектов.' Дополнительные операции над списками Помимо обычных операций над последовательностями и методов списков, Руб)топ предоставляет возможность выполнять более сложные операции над списками, известные как выралсенил генераторов списков ([ьвг сотрге)зеле[оп ехртеаа[оп), которые представляют эффективный способ обработки таких структур, как наша матрица. Предположим, например, что нам требуется извлечь из нашей матрицы второй столбец. Строку легко можно получить, выполнив операцию индексирования, потому что матрица хранится в виде строк, однако, благодаря генераторам списков, получить столбец ничуть не сложнее: »> со12 = [гон[1] гог гои 1п н) № Выбирает элеиенты второго столбца »> со[2 [2, 5, 8) »> Н № Матрица не изиенилась [[ 1, 2, 3 ), [4, 5, б ], [ 7, 8, 9] ] Генераторы списков следуют традиции системы представления множеств; они позволяют создавать новые списки, выполняя выражение для каждого элемента в последовательности, по одному за раз, слева Такая организация матриц вполне пригодна для решения небольших задач, но для реализации более сложных программ числовой обработки информации желательно использовать специализированные расширения, например ХшпРу.
Такого рода инструменты позволяют хранить и обрабатывать матрицы намного эффективнее, чем такая структура, реализованная в виде вложенных списков. Как уже говорилось, расширение ХсшРу превращает Руб)ьоп в свободный и более мощный эквивалент системы Маб[ аЬ, н такие организации, как [ч[АЗА, Ьоз А! апюз и ЛРМогяап С]газе используют его для решения научных и финансовых задач. Дополнительную информацию об этом расширении зы без труда найдете з Сети. 127 Словари направо.
Генераторы списков заключены в квадратные скобки (чтобы отразить тот факт, что они создают список) и составлены из выражения и конструкции цикла, которые используют одно и то же имя переменной (в данном случае гоп). В предыдущем примере генератор списков интерпретируется так: »Получить элементы сои[1) из каждой строки матрицы И и создать из них новый список». Результатом является новый список, содержащий значения из второго столбца матрицы.
На практике генераторы списков могут приобретать еще более сложную форму: »> [гоп[1] + 1 1ог гои 1п И) № Добавить 1 к камдоиу элементу в столбце 2 [3, б, 9] »> [ гоп[ 1] гог гои 1п и 11 гоп[ 1] х 2 == О) № Отфильтровать нечетнме эначенил [2, 03 Первая операция в этом примере прибавляет 1 к значениям всех отобранных элементов, а вторая использует условный оператор тг для исключения из результата нечетных чисел с помощью операции деления по модулю — % (остаток от деления). Генераторы списков, применяемые к спискам, возвращают в качестве результатов новые списки, но могут использоваться и для любых других объектов, допускающих выполнение итераций, например, ниже показано использование генератора списков для обхода жестко заданного в программном коде списка координат и строк: >» б1ао = [И[1Ц1] Гог 1 [п [О, 1, 2)) № Выборка элементов диагонали матрице »> 01ао [1, 5, 9) »> боев[па = [с * 2 гог с 1п 'враа'3 № дублирование сииволов е строке »> боцЫев [ эв', 'рр', 'аа', 'аа'3 Генераторы списков, на мой взгляд, достаточно сложная тема, чтобы говорить о них здесь более подробно.