Саммерфилд - Программирование на Python 3 (1077331), страница 35
Текст из файла (страница 35)
Когда вслед за именем функции записываются круглые скобки, они сообщают интерпретатору, что он должен вызвать эту функцию. Программа ил!диеигогг(в2ру на одну строку длиннее, чем исходная программа ип(г)иеюогг(в1.ру ((ало гг со11есг(олв), а, кроме того, изменились строки создания и обновления словаря. Ниже показано, как создается словарь со значениями по умолчанию: еегев = сс11есг)сев.еегее1ге~сг (впг) Словарь со значениями по умолчанию вогез никогда не возбудит исключение КеуЕггог. Если будет необходимо выполнить выражение х = ногов[ "худ" ] и в словаре будет отсутствовать элемент с ключом "хуг", то при обращении к несуществующему ключу словарь со значениями по умолчанию немедленно создаст новый элемент с ключом "хув" и значе- 163 Обход в цикле и копирование коллекций нием О (вызовом функции (пт( )), и это значение будет присвоено переменной х. ногпз(ноге) += 1 Теперь мы можем отказаться от использования метода 01сГ, пет() и просто увеличивать значение элемента.
Когда будет обнаружено самое первое вхождение слова, будет создан новый элемент со значением О (к которому тут же будет прибавлено число 1), а при обнаружении каждого последующего вхождения число 1 будет добавляться к текущему значению. Мы закончили полный обзор всех встроенных типов коллекций языка Ру(лоп и пары типов коллекций из стандартной библиотеки. В следующем разделе мы рассмотрим некоторые проблемы, общие для всех типов коллекций. Обход в цикле и копирование коллекций После того как будет создана коллекция элементов данных, вполне естественно возникает желание обойти все элементы, содержащиеся в ней.
В первом подразделе этого раздела мы познакомимся с итераторами языка Ру()гоп, а также с операторами и функциями, применяемыми для работы с итераторами. Еще одна часто выполняемая операция — копирование коллекций. Изза того, что в языке Ру(Ьоп повсеместно используются ссылки на объекты (ради повышения эффективности), существуют некоторые особенности, связанные с копированием, поэтому во втором подразделе этого раздела мы изучим принципы копирования коллекций и узнаем, как добиться именно того, что нам нужно. итераторы, функции и операторы для работы с итерируемыми объектами Итерируемый тип данных — это такой тип, который может возвращать свои элементы по одному.
Любой объект, имеющий метод 1тег (), или любая последовательность (то есть объект, имеющий метод оег(гев (), принимающий целочисленный аргумент со значением от О и выше), является итерируемым и может предоставлять итератор. Итератор — это объект, имеющий метод пехт (), который при каждом вызове возвращает очередной элемент и возбуждает исключение Згор1гегаг1оп после исчерпания всех элементов. В табл. 3.4 перечислены операторы и функции, которые могут применяться к итерируемым объектам.
164 Глава 3. Типы коллекций Таблица 3.4. Общие функции и операторы для работы с итерируемыми объектами Синтаксис Описание в11(!) апу(1) еппзегаге (1,вгэгг) 1еп(х) звх(1, Хеу) з1п(1, хеу) гехегвео(!) впз (1, вгвгг) г!р(11, ..., 1й) в+1 в*с х1п1 галсе (в !агг, ввор, егер) 5ОГ1ЕЗ (ц хеу, гехегве) Возвращает конкатенацию последовательностей в и 1 Возвращает конкатенацию из вп( и последовательностей в Возвращает Тгпе, если элемент х присутствует в итерируемом объекте 1, обратная проверка выполняется с помощью оператора по! 1п Возвращает Тгее, если все элементы итерируемого объекта ! в ло- гическом контексте оцениваются как значение Т гсе Возвращает Тгпе, если хотя бы один элемент нтерируемого объек- та 1 в логическом контексте оценивается как значение Тгсе Обычно используется в циклах го г...
1п, чтобы получить последо- вательность кортежей (! паех, ! Гез), где значения индексов начина- ют отсчитывать от 0 или от значения вгагг; подробности в тексте Возвращает «длину» объекта х. Если х — коллекция, то возвра- щаемое число представляет количество элементов. Если х — стро- ка, то возвращаемое число представляет количество символов Возвращает наибольший элемент в итерируемом объекте 1 нли элемент с наибольшим значением хеу(в вез), если функция пеу оп- ределена Возвращает наименьший элемент в итерируемом объекте 1 илн элемент с наименьшим значением хеу()вез), если функция хеу определена Возвращает целочисленный нтератор. С одним аргументом (в1ор) итератор представляет последовательность целых чисел от 0 до егор — 1, с двумя аргументами (вгагг, вгср) — последовательность целых чисел от в(агГ до в1ор - 1, с тремя аргументами — последа.
вательность целых чисел от вгаггдо в1ор - 1 с шагом егер Возвращает итератор, который будет возвращать элементы ите- ратора ! в обратном порядке Возвращает список элементов нтератора ! в отсортированном порядке; аргумент Псу используется для выполнения сортировки 1)БТ) (Ресогаве, Вогв, Т)пг)есогаве — декорирование, сортировка, обратное декорирование). Если аргумент гехегве имеет значение Т гее, сортировка выполняется в обратном порядке Возвращает сумму элементов нтерируемого объекта 1, плюс ар- гумент в ге г 1 (значение которого по умолчанию равно 0)1 объект 1 не должен содержать строк Возвращает итератор кортежей, используя итераторы от 11 до! Л; подробности в тексте 165 Обход з цикле и копирование коллекций Порядок, в котором возвращаются элементы, зависит от итерируемого объекта.
В случае списков и кортежей элементы обычно возвращаются в предопределенном порядке, начиная с первого элемента (находящегося в позиции с индексом 0), но другие итераторы возвращают элементы в произвольном порядке — например, итераторы словарей и множеств. ргооыот = 1 т = ттвг([1, 2, 4, 81) нот1в Тгыв: тгу: ргосвст .= ПВХ1(Ь) вховрт бтор11вгатьоп Ьгвак ргтпт(ргооыот) а выведет: 84 ргосыст = ! Го г 1 1п [ 1, 2, 4, 8 ); ргосоот *= т ргтпт(ргооыот) м выведет: 84 Любой (конечный) итерируемый объект 1 может быть преобразован в кортеж вызовом функции 1ор1е(1) или в список — вызовом функции Пат(1).
К итераторам могут применяться функции а11() и апу() и они часто используются в функциональном програм мировании. Ниже приводится пара примеров, демонст рирующих использование функций а11(), апу(), 1еп() м[п(), мах() и авм(): о Функцнонвльнов программнраваннв, стр. 397 »> х = [-2, 9, 7, -4, 3) »> в11(х), апу(х), 1вп(х), а(п(х), мах(х), вом(х) Встроенная функция 1(в г( ) используется двумя совершенно различными способами.
Применяемая к коллекции или к последовательности, она возвращает итератор для заданного объекта или возбуждает исключение ТуреЕггог, если объект не является итерируемым. Такой способ часто используется при работе с нестандартными типами коллекций и крайне редко — в других контекстах. Во втором варианте использования функции 1(ег() ей передается вызываемый объект (функция или метод) и специальное значение. В этом случае полученная функция или метод вызывается на каждой итерации, а значение этой функции, если оно не равно специальному значению, возвращается вызывающей программе; в противном случае возбуждается исключение Зто о[те та Стоп.
Когда в программе используется цикл [ог утеа [и )Гагар)е, интерпретатор Ру$)топ вызывает функцию 1(ег()Гагар)е), чтобы получить итератор. После этого на каждой итерации вызывается метод пех1 () итератора, чтобы получить очередной элемент, а когда возбуждается исключение 81ор[1вгаг[оп, оно перехватывается и цикл завершается. Другой способ получить очередной элемент итератора состоит в том, чтобы вызвать встроенную функцию пех((). Ниже приводятся два эквивалентных фрагмента программного кода (оба они вычисляют произведение элементов списка), в одном из них используется цикл уог ... [и, а во втором явно используется итератор: Глава 3. Типы коллекций 166 (Тгие.
Тгпе, 5, -4, 9, 13) »> х.аррепб(0) »> а11(х), апу(х), 1еп(х), в!п(х), вах(х), врв(х) (Га1яе, Тгпе, 6, -4, 9, 13) Из всех этих маленьких функций наиболее часто, пожалуй, используется функция 1еп(). Функция епсвегате() принимает итератор и возвращает объект перечисления. Этот объект может рассматриваться как своего рода итератор.
На каждой итерации он возвращает кортеж из двух элементов, первый из которых — это номер итерации (по умолчанию нумерация начинается с 0), а второй — следующий элемент итератора, который был передан функции епцвега(е(). Давайте рассмотрим порядок использования функции епсвега1е() в контексте небольшой, но законченной программы.
Программа дгернгогг(.ру принимает в виде аргументов командной строки слово и одно или более имен файлов. Она выводит имя файла, номер строки и саму строку, содержащую искомое слово.' Ниже приводится пример сеанса работы с программой: дгервсгб.ру Осв бага/(сгепавев.1хг баяв/(огепавев. 1хг;6!5:Осв!пухав бага/гогепавев, (х1,1435:Оов!и!к бага/Гсгепавев. 1х1.1611:Освлпа11 ба!а/Тогепавев.
1х(:3314:Орв>п!с Файлы с данными г(а!а//огепатевЛх! и Йа1а/яиглатеяЛх! содержат несортированные списки имен, по одному имени в каждой строке. Не считая инструкции импортирования модуля вув, программа занимает всего десять строк: 1Г 1еп(вуя.агду) < 3: рг!пг("сваде, дгервргб.ру всгб !п(>1е1 [1пг!1е2 (... !пг!1еи]]") вув.ехы() всгб = вув.агду[1] Гаг Г!1епаве !п вув.агду[2;]: гог 1>пс, 1!пе !и епивегэге(срэп((>1епаве), вгяг(=1): >Г всгб >и 1>пе: рг!пг("(О):(1);(2:.40)".Гсгвэг((!1епяве, 1!пс, 1!пе.гв!г>р())) Программа начинается с проверки наличия хотя бы двух аргументов командной строки.