Саммерфилд - Программирование на Python 3 (1077331), страница 7
Текст из файла (страница 7)
Это возможно благодаря тому, что списки относятся к категории изменяемых объектов. Потенциально зто более эффективно, чем создание нового списка, включающего первоначальные элементы и дополнительный элемент с последующим связыванием ссылки на объект с новым списком, особенно для очень длинных списков. В процедурном языке то же самое могло бы быть достигнуто с использованием метода аррепс(), как показано ниже (что является совершенно допустимым вариантом в языке Ру1йоп): »> 1го1.аррепп[х, "ехгга") »> х ['хоьга', 49, -879, 'аогсчагя', 200, 'эоге', 'ехгга'] Здесь указываются тип данных и метод этого типа данных, а в качестве первого аргумента передается элемент данных того типа, метод которого вызывается, за которым следуют дополнительные параметры.
(С точки зрения наследования между этими двумя подходами существует малозаметное семантическое отличие; на практике наиболее часто используется первая форма. О наследовании рассказывается в главе 6.) »Золотой запас» Ру[Ьоп 35 Если вы еще не знакомы с объектно-ориентированным программированием, на первый взгляд такая форма вызова функций может показаться немного странной.
Пока вам достаточно будет знать, что обычные функции в языке РуФйоп вызываются так: гопсс! Ьп))аав(агд! аепга), а методы вызываются так: оЬ)всга[аг»в.аегаодзгаав(агдоаепга). (Об объектно-ориентированном программировании рассказывается в главе 6.) Оператор точки (» оператор доступа к атрибуту» ) используется для доступа к атрибутам объектов. До сих пор мы видели только одну разновидность атрибутов — методы, но атрибут может быть объектом любого типа. Поскольку атрибут может быть объектом, имеющим свои атрибуты, которые также могут быть объектами, обладающими атрибутами и т. д., мы можем использовать столько операторов точки, сколько потребуется для доступа к необходимому атрибуту.
Тип ]заг имеет множество других методов, включая зпаегс(), который используется для вставки элемента в позицию с определенным индексом, и гевоче(), который удаляет элемент с указанным индексом. Как уже упоминалось ранее, счет индексов в языке РуФ]зоп начинается с О. Ранее мы уже видели, что существует возможность извлечь из строки символ, используя оператор квадратных скобок, и отметили, что этот оператор может использоваться с любыми последовательностями.
Списки — это последовательности, поэтому мы можем выполнять следующие операции: »> х ['зеьга', 49, -879, 'аагачагх', 200, 'аоге', 'а»ага'] »> х[0] 'зеога' »> х[4] 200 Кортежи также являются последовательностями, поэтому, если бы ссылка х указывала на кортеж, мы могли бы извлекать элементы с помощью квадратных скобок точно так же, как это было сделано со ссылкой х, представляющей список. Но так как списки являются изменяемыми объектами (в отличие от строк и кортежей, которые являются неизменяемыми объектами), мы можем использовать оператор квадратных скобок еще и для изменения элементов списка. Например: »> х[1] = "Чогсу пзпе' »> х ['зеога', 'гог1у и!па', -879, 'аагочагх', 200, 'аоге', 'ехсга ] Если указать индекс, выходящий за пределы списка, будет возбуждено исключение — обработка исключений вкратце будет рассматриваться в разделе с описанием составляющей ]хаб, а полный охват этой темы дается в главе 4.
Мы уже несколько раз использовали термин последовательность, полагаясь на неформальное понимание его смысла, и продолжим его Глава 1. Быстрое введение в процедурное программирование использовать в том же духе. Однако язык Ру1]топ дает точное определение последовательностей и какие особенности должны ими поддерживаться, точно так же он точно определяет, какие особенности должны поддерживаться объектами, имеющими размер, и так далее для других категорий, которым могут принадлежать типы данных, но об этом будет рассказываться в главе 8.
Описки, кортежи и другие типы коллекций, встроенные в язык Ру- 1]топ, описываются в главе 3. Составляющая й'4: логические операции Одна из фундаментальных особенностей любого языка программирования заключается в поддержке логических операций. Язык Ру1]топ предоставляет четыре набора логических операций, и здесь мы рассмотрим основные принципы их использования. Оператор идентичности Поскольку все переменные в языке Руь]топ фактически являются ссылками, иногда возникает необходимость определить, не ссылаются ли две или более ссылок на один и тот же объект. Оператор 13 — это двухместный оператор, который возвращает Тгье, если ссылка слева указывает на тот же самый объект, что и ссылка справа.
Ниже приводятся несколько примеров: »> а = [таетепттоп", 3, нопе] »> ь = [таетеп11пп", 3, нопе] »> а [а Ь Га[ае »> ь = а »>атаЬ Тгпе Обратите внимание, что обычно не имеет смысла использовать оператор та для сравнения типов данных тп1, 31г и некоторых других, так как обычно в этом случае бывает необходимо сравнить их значения. Фактически результаты сравнения данных с помощью оператора тв могут приводить в замешательство, как это видно из предыдущего примера, где а и Ь первоначально имеют одинаковые значения-списки, однако сами списки хранятся в виде отдельных объектов типа 1тат, и поэтому в первом случае оператор 13 вернул Га1ае.
Одно из преимуществ операции проверки идентичности заключается в высокой скорости ее выполнения. Это обусловлено тем, что сравниваются ссылки на объекты, а не сами объекты. Оператор та сравнивает только адреса памяти, в которых располагаются объекты — если адреса равны, следовательно, ссылки указывают на один и тот же объект. «Эолотой запас» руФоп Чаще всего оператор св используется для сравнения элемента данных со встроенным пустым объектом (»опе, который часто применяется, чтобы показать, что значение «неизвестно» или «не существует»: »> а = "впиесшпр" »> Ь = попа »> а св пот попе, Ь тв попе (Тгна, Тгие) Для выполнения проверки на неидентичность, используется оператор св пос. Назначение оператора проверки идентичности состоит в том, чтобы узнать, ссылаются ли две ссылки на один и тот же объект, или проверить, не ссылается ли ссылка на объект г(опе.
Если требуется сравнить значения объектов, мы должны использовать операторы сравнения. Операторы сравнения Язык Рус)соп предоставляет стандартный набор двухместных операторов сравнения с предсказуемой семантикой: < меньше чем, <= меньше либо равно, == равно, ! = не равно, >= больше либо равно и > больше чем. Эти операторы сравнивают значения объектов, то есть объекты, на которые указывают ссылки, участвующие в сравнении. Ниже приводятся примеры, набранные в командной оболочке Рус)топ: »> а = 2 »> Ь = 6 »> а == Ь га)ва »> а < Ь Тгне »> а <= Ь, а '= Ь, а >= Ь, а > Ь (Тгаа, Тгна, Га1ва, Га1ве) Для целых чисел они действуют, как и следовало ожидать.
Точно так же корректно выполняется сравнение строк: »> а = "папу расла" »> ь = "аапу расла" »>аввЬ га1ве »> а == Ь Тгна Хотя а и Ь ссылаются на разные объекты (с различными Сравнение идентификатоРами), тем не менее они имеют одинаковые стра„в,р 66 значения, поэтому результат сравнения говорит о том, что они равны. Однако не следует забывать, что в языке Русйоп для представления строк используется кодировка Юникод, поэтому сравнение строк, содержащих сим- Глава 1. Быстрое введение в процедурное программирование волы, не входящие в множество АЯС11-символов, может оказаться делом более сложным, чем кажется на первый взгляд — подробнее эта проблема будет рассматриваться в главе 2.
Одна из интересных особенностей операторов сравнения в языке Руфйоп заключается в том, что они могут объединяться в цепочки. Например: »> в = 9 »> О <= а <= 10 Тгыв Это отличный способ убедиться, что некоторый элемент данных находится в пределах диапазона, вместо того чтобы выполнять два отдельных сравнения, результаты которых объединяются логическим оператором апб, как это принято во многих других языках программирования. Кроме того, у этого подхода имеется дополнительное преимущество, так как оценка значения элемента данных производится только один раз (поскольку в выражении он появляется всего один раз), что может иметь большое значение, особенно когда вычисление значения элемента данных является достаточно дорогостоящей операцией или когда обращение к элементу данных имеет побочные эффекты.
Благодаря «строгости» механизма динамического контроля типов в языке Ру(йоп попытка сравнения несовместимых значений вызывает исключение. Например: »> "тпгвв" < 4 тгвсесаси (ысвт гвсепт са11 1ззт): (Трассированная информация (самый последний вызов внизу> турвеггсг: ыпсговгаыв (урез: зтг() < 1пт() (турвеггсг: несопоставимые типы: зтг() < гпт()) В случае, когда возбуждается необрабатываемое исключение, интерпретатор Руфйоп выводит диагностическую информацию и текст сообщения об ошибке. Для простоты мы опустили диагностическую информацию здесь, заменив ее многоточием.' То же самое исключение ТуреЕггог возникнет, если записать "3" < 4, потому что Ру$Ьоп никогда не пытается строить предположения о наших намерениях — правильный подход заключается в том, чтобы выполнить явное преобразование, например: 1пт("3" ) < 4, или использовать сопоставимые типы, то есть оба значения должны быть либо целыми числами, либо строками.