Саммерфилд - Программирование на Python 3 (1077331), страница 29
Текст из файла (страница 29)
Отличаются они возможностью ссылаться на элементы кортежа не только по числовому индексу, но и по имени, что в свою очередь позволяет создавать сложные агрегаты из элементов данных. В модуле со11есгтопз имеется функция пааебгор1е(). Эта функция используется для создания собственных типов кортежей. Например: 5а1е = со!1есттопв, пааебтор1е("5а1е", "ргобост1б совтоаег1а бате доапт1ту ргтсе") Первый аргумент функции со! 1ес11опа, пааеб1ор1е( ) — это имя создаваемого кортежа. Второй аргумент — это строка имен, разделенных пробелами, для каждого элемента, который будет присутствовать в этом кортеже. Первый аргумент и имена во втором аргументе должны быть допустимыми идентификаторами языка Руб)топ.
Функция возвращает класс (тип данных), который может использоваться для создания именованных кортежей. Так, в примере выше мы можем интерпретировать имя За1е как имя любого другого класса (такого как гор1е) в языке Рубикон и создавать объекты типа Ба1е.' Например: ва!ев = [) ва1ев.аррепб(5а1е(432, 921, "2008-09-14", 3, 7.99)) за1ев.аррепб(5а1е(4!9, 874, "2008-09-!5", т, 18,49)) В этом примере мы создали список из двух элементов типа Яа1е, то есть из двух именованных кортежей. Мы можем обращаться к элементам таких кортежей по их индексам — например, обратиться к элементу рг1се в первом элементе списка ва1ев можно с помощью выражения ва1еа[0)[-1) (вернет значение 7.99) — или по именам, которые делают программный код более удобочитаемым: тота1 = 0 Тог ва1е тп ва1ез.
тота1 += ва!е.Овал!!ту * аа1е.рпсе ргтпт("тога! $(0:.21)".(огаат(тета!)) а выведет: тота1 $42 46 Очень часто простоту и удобство, которые предоставляют именованные кортежи, можно обратить на пользу делу. Например, ниже приводится версия примера «а1гсгай» нз предыдущего подраздела (стр. 133), имеющая более аккуратный вид: »> Атгогагт = со1!ест!сов.пааебтор!е("А!гога!1", "аапогаотогег аобе1 веаттпд") »> 5еаыпд = со1!ест)опз.пааебтор1е("8еаттпд", "а1п!аоа аахтаоа") Примечание для программистов, использующих объектно-ориентированный стиль: каждый класс, созданный таким способом, будет являться подклассом класса шр!е.
135 Последовательности »> атгсгатт = А1гсгатт("Азгьоа", "4320-200", Беат>Ар()00, 220)) »> а(гсгатт.зеат1пр.эактэоэ 220 Уже видно, что именованные кортежи могут быть очень удобны; кроме того, в главе 6 мы перейдем к изучению объектно-ориентированного программирования, где выйдем за пределы простых именованных кортежей и узнаем, как создавать свои собственные типы данных, которые могут не только хранить элементы данных, но и иметь собственные методы.
СПИСКИ Список — зто упорядоченная последовательность из нуля Извлечение или более ссылок на объекты. Списки поддерживают тот срезов из же синтаксис получения срезов, что и строки с кортежа- строк, стр. 89 ми. Это упрощает извлечение элементов из списка. В отличие от строк и кортежей списки относятся к категории изменяемых объектов, поэтому мы можем замещать или удалять любые их элементы. Кроме того, существует возможность вставлять, замещать и удалять целые срезы списков.
Тип данных 1(а 1 может вызываться как функция 11ат( )— без аргументов она возвращает пустой список, с аргументом типа 1191 возвращает поверхностную копию аргумента; в случае, если аргумент имеет другой тип, выполняется попытка преобразовать его в объект типа 1та(. Эта функция принимает не более одного аргумента. Кроме того, списки могут создаваться без использования функции 1191(). Пустой список создается с помощью пары пустых квадратных скобок 1), а список, состоящий из одного или более элементов, может быть создан с помощью последовательности элементов, разделенных за- списков, пятыми, заключенной в квадратные скобки.
Другой спо- стр 142' соб создания списков заключается в использовании генераторов списков — эта тема будет рассматриваться ниже в этом подразделе. Поскольку все элементы списка в действительности являются ссылками на объекты, списки, как и кортежи, могут хранить элементы любых типов данных, включая коллекции, такие как списки и кортежи. Списки могут сравниваться с помощью стандартных операторов сравнения («, =, ==, ! =, »=, ), при этом сравнивание производится поэлементно (и рекурсивно, при наличии вложенных элементов, таких как списки или кортежи в списках). В результате выполнения операции присваивания 1 = (-17. 5, 7 К(10", 49, "з)", ("гав", 5, "есзо"), 7] мы получим список, как показано на рис.
3.2. Глава Э. Типы коллекций Рис. 3.2. Позиции элементов в слиске К спискам, таким как [, мы можем применять оператор извлечения среза, повторяя его столько раз, сколько потребуется для доступа к эле- ментам в списке, как показано ниже: 0[0] == 0[-5] == -17.5 0[1] == [[-5] == 'Х!10' 1[1ПО] == [[-5П0] == 'к' [[4П2] == 1[4П-1] == 1[-2П2] == [[-2П-1] == 'еспо' [[4П2П1] == [[4П2П-3] == [[-2П-1П1] == 1[-2П-1П-3] == 'с' Списки, как и кортежи, могут вкладываться друг в друга; допускают выполнение итераций по их элементам и извлечение срезов.
Все примеры с кортежами, которые приводились в предыдущем подразделе, будут работать точно так же, если вместо кортежей в них будут использованы списки. Списки поддерживают операторы проверки на вхождение 1п и лог 1п, оператор конкатенации +, оператор расширения += (то есть добавляет операнд справа в конец списка) и операторы дублирования * и *=. Списки могут также использоваться в качестве аргументов функции 1еп() и в инструкции 0е1, которая будет рассматриваться в этом подразделе и которая описывается во врезке »Удаление элементов с помощью инструкции г(е[» на стр.
139. Кроме того, списки предоставляют методы, перечисленные в табл. 3.1. Таблица 3.1. Методы слисков Синтаксис 0 зррепп (х) ы ссппг(х) Описание Добавляет элемент х э конец списка 1 Возвращает число вхождений элемента х в список [ Добавляет э конец списка [ все элементы итерируемого объ- екта а; оператор»= делает то же самое Ы ехгепп(з) э Возвращает индекс самого первого (слева) вхождения элемен- та х в список 1 (или в срез з1а г1: епс списка [), в противном слу- чае возбуждает исключение ра)пе5ггег Ы гппех(х.
эгагг, епа) Вставляет элемент х в список [ в позицию [пг 1 С гпвег1(1, х) [ рср() ы рор(7) Удаляет самый последний элемент из списка [ н возвращает его в качестве результата Удаляет из списка [ элемент с индексом 1пг 1 и возвращает его в качестве результата Последовательности Синтаксис Описание Удаляет самый первый (слева) найденный элемент х из спи- ска Е или возбуждает исключение На1иеЕггсг, если элемент х ве будет найден 'ь.геасуе(х) Переставляет в памяти элементы списка в обратном порядке С геиегзе() с зпгт(,,.) Сортирует список в памяти.
Этот метод прнФункция иимает те же необязательные аргументы Аеу тее() н геуегзе, что и встроенная функция зсгтее() стр. 184, 170 Несмотря на то, что для доступа к элементам списка можно использовать оператор извлечения среза, тем не менее в некоторых ситуациях бывает необходимо одновременно извлечь две или более частей списка. Сделать это можно с помощью операции распаковывания последовательности. Любой итерируемый объект (списки, кортежи и другие) может быть распакован с помощью оператора распаковывания»звездочка» (*). Когда слева от оператора присваивания указывается две или более переменных, одна из которых предваряется символом °, каждой переменной присваивается по одному элементу списка, а переменной со звездочкой присваивается оставшаяся часть списка.
Ниже приводится несколько примеров выполнения распаковывания списков: »> т!гзт, гезт = [9, 2, -4, 8, 7] »> гтгж, гезт (9, [2, -4, 8, 7]) »> гтгж, аы, 1аж = "спаг1ез Рш!тр Агтьиг Сестре итпсзсг".зр!11() »> 11гзт, а!С. 1азт ('сьаг1ез', ['Рь!1тр', 'Агтпиг', 'Сестре'], 'птпсзсг') »> *стгестсыез, ехеситаь1е = "/изг/1пса1/ь!п/9»!а".зр1!1( '/ ) »> стгестсыез, ехеситаЬ)е ([ , изг, 1сса!, Ь!и ], 9ч!а ) Ее( ргсеист(а, Ь. с): гетигп а * Ь * с я здесь * - этр оператор умножения тогда мы можем вызывать эту функцию с тремя аргументами или ис- пользовать аргументы со звездочкой: »> ргсеист(2, 3, 5) 30 »>С=[2, 3, 5! »> ргсеис!(*ь) Когда используется оператор распаковывания последовательности, как в данном примере, выражение *газ! и подобные ему называются выражениями со звездочкой.
В языке Ру1)гоп имеется также похожее понятие ареументое со звез- дочкой. Например, допустим, что имеется следующая функция, при- нимающая три аргумента: ЯЗВ Глава 3, Типы коллекций 30 »> ргосцс!(2, *Ц1:]) 30 В первом примере функция вызывается, как обычно, с тремя аргументами. Во втором вызове использован аргумент со звездочкой; в этом случае список из трех элементов распаковывается оператором *, так что функция получает столько аргументов, сколько ей требуется.
Того же эффекта можно было бы добиться при использовании кортежа с тремя элементами, В третьем вызове функции первый аргумент передается традиционным способом, а другие два — посредством применения операции распаковывания двухэлементного среза списка [. Функции и передача аргументов полностью будут описываться в главе 4. В программах всегда однозначно известно, является оператор * оператором умножения или оператором распаковывания последовательности. Когда он появляется слева от оператора присваивания — это оператор распаковывания; когда он появляется где-то в другом месте (например, в вызове функции) — это оператор распаковывания, если он используется в одноместном операторе, и оператор умножения, если он используется в двухместном операторе.
Мы уже знаем, что имеется возможность выполнять итерации по элементам списка с помощью конструкции гог !Геа !п (:. Если в цикле потребуется изменять элементы списка, то можно использовать следующий прием: Гог > гп галде(1еп(1)): 1[>] = ргосеая(1[>]) о Встроенная функция гапце() возвращает целочисленный Функция галов(), итератор.
С одним целочисленным аргументом, л, итерастр.)ау тор гап0е() возвращает последовательность чисел О, 1, ..., п — 1. Этот прием можно использовать для увеличения всех элементов в списке целых чисел. Например: Гог ! >п гансе( 1еп(пцаЬега)) пцпЬега[!] += 1 Поскольку списки поддерживают возможность извлечения срезов, в определенных случаях один и тот же эффект может быть достигнут как с помощью оператора извлечения среза, так и с помощью одного из методов списков. Например, предположим, что имеется список иооаа = [ "Сесе г", "Уегу", "Г! г" ]; дополнить такой список можно двумя способами: проса и= ["Кацгу, Гьагсл"] ! носов.ехгепо(["канг!", 3ьагсп"]) В обоих случаях в результате будет получен список ['Сезаг', 'Уеуг', 'Р!г', 'Кацг!', '[агсп'].