Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

[ Россум, Дрейк, Откидач ] Язык программирования Python

.pdf
Скачиваний:
285
Добавлен:
25.04.2014
Размер:
1.5 Mб
Скачать

10.2. Выражения

111

Операторы or и and всегда возвращают один из своих операндов. Причем второй операнд операторов or и and вычисляется, только если это необходимо для получения результата.

not x

Если x ложно, то 1, иначе 0.

x and y

Если x ложно, то x, иначе y.

x or y

Если x ложно, то y, иначе x.

10.2.7 Оператор lambda

lambda param_list: expression

Короткая форма создания (безымянной) функции, возвращающей значение выражения expression. Ее поведение аналогично поведению функции, созданной с помощью инструкции ‘def name(param_list): return expression’. Синтаксис списка параметров описан в разделе 10.4.5.

Обратите внимание, что функция, создаваемая с помощью оператора lambda, не может содержать инструкций. Кроме того, lambda-функция (как и функция, определенная с помощью инструкции def) не имеет доступа к локальному пространству имен блока, в котором она определена. Однако Вы можете обойти это ограничение, используя аргументы, имеющие значения по умолчанию, например:

def make_incrementor(increment): return lambda x, n=increment: x+n

lambda имеет наименьший приоритет среди операторов, однако его приоритет больше чем у конструкции, образующей список выражений. Так, например, выражение ‘lambda: 1, 2’ эквивалентно выражению ‘(lambda: 1), 2’ и образует кортеж из двух элементов: функции, возвращающей 1, и числа 2.

10.2.8 Списки выражений

Список выражений (аргументов) образуется путем перечисления выражений (идентификаторов) через запятую. Списки аргументов функции и выражений, образующий кортеж, может содержать завершающую запятую, однако она не имеет никакого значения, за исключением одного случая: завершающая запятая необходима для образования кортежа, содержащего один элемент (см. раздел 11.2.3). Использование завершающей запятой в списке аргументов инструкций, кроме инструкции print, не допускается. Завершающая запятая в списке аргументов инструкции print указывает на то, что не нужно выводить символ перехода на новую строку (см. раздел 10.3.5).

112

Глава 10. Синтаксис и семантика

10.2.9Сводная таблица приоритетов

Ниже перечислены все конструкции и операторы, которые могут быть использованы для создания выражений, в порядке уменьшения приоритета. Конструкции, перечисленные

водном пункте, имеют одинаковый приоритет.

1.Атомы: идентификаторы, литеральные и “замкнутые” (‘(expression . . . )’, ‘[expression . . . ]’, ‘{key: value . . . }’, ‘‘expression‘’) выражения.

2.Первичные выражения: x.attribute, x[key], x[slice_list], x(arg_list).

3.** (см. замечания в разделе 10.2.3).

4.Унарные операторы +, - и ~.

5.*, /, %.

6.Бинарные операторы + и -.

7.<<, >>.

8.&.

9.^.

10.|.

11.Условные операторы: <, <=, >, >=, ==, !=, <>, is [not], [not] in.

12.not.

13.and.

14.or.

15.lambda.

16.expr1, ... (образование списка выражений).

10.3Простые инструкции

Простые инструкции записываются в одну логическую строку. Логическая строка может содержать несколько простых инструкций разделенных точкой с запятой.

10.3. Простые инструкции

113

10.3.1 Инструкции-выражения

Инструкции-выражения обычно используются для вычисления и вывода значения выражения (в интерактивном режиме) или для вызова “процедур” — функций, возвращающих незначимый результат (None) и состоят из одного выражения (список выражений также является выражением).

В интерактивном режиме значение выражения, если оно не равно None, преобразуется в строку аналогично тому, как это делает встроенная функция repr() и выводится на стандартный поток вывода. Значение None не выводится — таким образом вызов процедур не дает никакого вывода.

10.3.2 Присваивание

Присваивание (‘lvalue = expression’) используется для того, чтобы связать идентификатор (существующий или новый) с объектом, для создания и изменения атрибутов объектов, изменения элементов изменяемых последовательностей, добавления и изменения записей в отображениях. Присваивание может производиться (выражения, которые могут быть использованы слева от знака равенства, обычно называют lvalue):

name = expression

Идентификатору.

x.attribute = expression

Атрибуту. Обычно имя attribute в пространстве имен объекта x связывается с объектом, являющимся результатом вычисления выражения expression. Вы можете контролировать поведение при присваивании атрибуту экземпляра класса, определив для класса специальный метод __setattr__().

x[key] = expression

Элементу последовательности или отображения. Изменение элементов экземпляров классов реализуется специальным методом __setitem__().

x[slice_list] = expression

Подпоследовательности (синтаксис списка срезов slice_list описан в разделе 10.2.2). Выражение expression должно быть последовательностью. Присваивание срезу экземпляра контролируется с помощью специального метода __setslice__() (если используется простая запись среза) или __setitem__() (если используется расширенная запись срезов).

lvalue, . . . = expression (lvalue, . . . ) = expression

[lvalue, . . . ] = expression

Конструкции, используемой для создания кортежей и списков (в том числе, произвольным образом вложенных) из всех перечисленных выражений. Операция присваивания выполняется путем распаковки последовательностей. Результат вычисления выражения expression должен быть последовательностью, содержащей

114

Глава 10. Синтаксис и семантика

такое же количество элементов, какое указано слева от знака равенства. Каждому вложенному списку слева в результате должна соответствовать подпоследовательность с таким же количеством элементов. При несоответствии количества элементов генерируется исключение ValueError. Приведем несколько примеров:

>>>x = range(1)

>>>y, = range(1)

>>>print x, y [0] 0

>>>class c:

...

def __init__(self, val):

...

self.val = val

...

def __repr__(self):

...

return ’c(’+‘self.val‘+’)’

...

 

>>>o = c(1)

>>>l = range(3)

>>>l[1], [(x, y), o.val] = [10, (xrange(2, 4), 5)]

>>>print x, y, l, o

2 3 [0, 10, 2] c(5)

Значение выражения справа от = (включая упаковку) вычисляется до того, как начинается присваивание. Таким образом, инструкция ‘a, b = b, a’ обменивает значения переменных a и b. Однако следующий пример выведет ‘[0, 2]’:

x = [0, 1] i = 0

i, x[i] = 1, 2 print x

Начиная с версии 2.0, возможно одновременное выполнение арифметической или битовой операции и присваивания:

lvalue += expression lvalue -= expression lvalue *= expression lvalue /= expression lvalue %= expression lvalue **= expression lvalue &= expression lvalue |= expression lvalue ^= expression lvalue >>= expression lvalue <<= expression

Если lvalue является неизменяемым объектом, инструкция ‘lvalue op= expression’ всегда эквивалентна последовательному применению оператора и присва-

10.3. Простые инструкции

115

иванию результата (нового объекта) lvalue (‘lvalue = lvalue op expression’). Здесь, в отличие от обычного присваивания, lvalue не может быть кортежем.

Заметим, что формально присваивание в языке Python не является оператором, то есть, не возвращает значения и не может быть использовано в выражениях. Так сделано, например, чтобы избежать ошибочного использования = вместо == в инструкции if.

10.3.3Инструкция del

Семантика инструкции ‘del lvalue’ во многом схожа с семантикой присваивания (синтаксис lvalue описан в разделе 10.3.2). Удаление идентификатора удаляет привязку имени (которое должно существовать) в локальном или глобальном пространстве имен (см. раздел 10.5) к объекту. При удалении атрибута обычно удаляется соответствующее имя из пространства имен объекта. Вы можете контролировать поведение при удалении атрибутов экземпляров, определив для класса специальный метод __delattr__(). Удаление элементов (записей) из экземпляров-последовательностей (экземпляров-отображений) реализуется специальным методом __delitem__(), подпоследовательности — специальным методом __delslice__() (если используется простая запись среза) или __delitem__() (при использовании расширенной записи срезов).

10.3.4Пустая инструкция

Инструкция pass ничего не делает и может быть полезна там, где инструкция требуется синтаксисом, однако нет необходимости в выполнении каких либо действий, например:

#ЖХОЛГЙС, ЛПФПТБС ОЙЮЕЗП ОЕ ДЕМБЕФ def do_nothing(arg): pass

#РХУФПК ЛМБУУ

class record: pass

10.3.5Инструкция print

Инструкция ‘print [expr_list]’ для каждого выражения в списке выражений expr_list вычисляет его значение и выводит строковое представление значения выражения на стандартный поток вывода, разделяя их пробелами (необходимость вывода пробела контролируется атрибутом softspace файлового объекта). Строковое представление получается аналогично тому, как это делает встроенная функция str() (см. раздел 12).

Если список выражений не заканчивается запятой, в конце выводится символ перехода на новую строку. Это единственное действие, которое выполняется, если ин-

116

Глава 10. Синтаксис и семантика

струкция содержит только ключевое слово print.

В качестве стандартного потока вывода используется файловый объект, на который ссылается переменная stdout в модуле sys. Если имя sys.stdout было удалено, генерируется исключение RuntimeError.

Начиная с версии 2.0, инструкция print может быть использована для вывода в любой файл. Для этого после ключевого слова print необходимо поставить >> и первое выражение в списке expr_list должно давать файловый объект или None (в этом случае для вывода будет использоваться sys.stdout). Например:

print >> sys.stderr, ’пЫЙВПЮЛБ ЧЩЫМБ!’

Инструкция print предъявляет следующие требования к файловому объекту, в который производится вывод: объект должен иметь метод write() и доступный для записи атрибут softspace (последнее всегда верно для экземпляров классов, не имеющих специальных методов __getattr__() и __setattr__()).

10.3.6Инструкция break

Инструкция break может быть использована только (синтаксически) внутри циклов for и while, но не в определении функции или класса, находящегося в цикле. Прерывает выполнение самого вложенного цикла (пропуская ветвь else цикла, если она присутствует). При прерывании цикла for переменная (или переменные), в которой хранится значение текущего элемента, остается неизменной.

Если для выхода из цикла необходимо покинуть блок инструкции try с ветвью finally, перед выходом выполняется ветвь finally.

10.3.7Инструкция continue

Инструкция continue может быть использована только (синтаксически) внутри циклов for и while, но не в определении функции или класса, находящегося в цикле. В текущих версиях инструкция continue также не может быть использована внутри основного блока инструкции try (расположенного синтаксически внутри цикла) — только в ветвях except и else2. Инструкция продолжает выполнение наиболее вложенного цикла со следующего прохода.

2Это ограничение, возможно, будет снято в будущих версиях языка.

10.3. Простые инструкции

117

10.3.8Инструкция return

Инструкция ‘return [expression]’ (может быть использована синтаксически только в определении функции) прерывает выполнение функции (при ее вызове) используя значение выражения expression (None, если выражение опущено) в качестве возвращаемого функцией значения.

Если для возврата из функции необходимо покинуть блок инструкции try с ветвью finally, перед возвратом выполняется ветвь finally.

10.3.9Инструкция global

Инструкция ‘global identifier_list’ указывает на то, что идентификаторы identifier_list (список через запятую идентификаторов) во всем текущем блоке ссылаются на глобальные переменные. В то время как использование в выражениях глобальных имен производится автоматически, если они не определены (нигде в текущем блоке) в локальном пространстве имен, присваивание глобальным именам без использования инструкции global невозможно.

Если имена где-либо в данном блоке кода указаны в инструкции global, их следует использовать только после этой инструкции. Такие имена не должны использоваться как формальные параметры циклов for, определений классов и функций и не должны быть среди имен, импортируемых инструкцией import. В текущих версиях инструкции for, class и def изменяют глобальную переменную, а инструкция import не импортирует такие имена, однако в будущих версиях поведение может измениться.

Инструкция global является директивой синтаксическому анализатору команд

иприменяется только к единовременно компилируемому блоку кода. В частности, инструкция global, содержащаяся в инструкции exec не оказывает влияния на блок кода, в котором содержится эта инструкция exec. И наоборот, инструкция global в блоке кода, содержащем также инструкцию exec, не оказывает влияние на код в этой инструкции exec. То же самое верно и для встроенных функций eval(), execfile()

иcompile().

10.3.10 Инструкция import

Существует три формы записи инструкции import:

import module_list

Импортирует указанные модули. module_list — список через запятую полных имен модулей (если модуль находится в пакете — используется запись через точку, например, РБЛЕФ.РПДРБЛЕФ.НПДХМШ) с возможным указанием имен, к которым будут привязаны объекты-модули в локальном пространстве имен (см. ниже).

118

Глава 10. Синтаксис и семантика

from module import obj_list

Импортирует объекты из модуля module. obj_list — список через запятую идентификаторов объектов (идентификатор объекта может ссылаться, в том числе, и на объект-модуль, но, в отличие от имени модуля, не может использовать запись через точку) с возможным указанием имен, к которым будут привязаны объекты в локальном пространстве имен (см. ниже).

from module import *

Импортирует все имена из модуля module, кроме имен, начинающихся с символа подчеркивания.

Инструкция import выполняется в два этапа:

1.Интерпретатор находит модуль (или модули) и, если это необходимо, инициализирует его.

2.Связывает имена в текущем локальном пространстве имен с объектами-модулями (первая форма записи инструкции) или объектами, на которые ссылаются соответствующие имена в модуле.

Начиная с версии 2.0, Вы имеете возможность указать имя, к которому будет привязан объект в локальном пространстве имен, используя запись ‘object as local_name’ в списке модулей (module_list) или объектов (obj_list). Так, например, инструкция ‘import operator’ привязывает импортированный объект-модуль к локальному имени operator, в то время как ‘import operator as op’ привязывает тот же объект-модуль к локальному имени op. Во избежание недоразумений не допускается импортирование под другим именем объектов, для которых используется точечная запись: вместо ‘import xml.sax as s’ необходимо использовать запись ‘from xml import sax as s’.

Под инициализацией модуля, реализованного на языке Python, подразумевается создание пустого объекта-модуля, добавление его в таблицу sys.modules и выполнение в контексте этого модуля инструкций из файла ‘module.py’ (или ‘__init__.py’ в каталоге ‘module’, если модуль является пакетом). Точнее, выполняется его байт-компилированная версия — файл ‘module.pyc’ или ‘module.pyo’ в зависимости от того, используется оптимизация или нет. Если соответствующий байт-компилированный файл отсутствует или не соответствует исходному ‘.py’-файлу, интерпретатор компилирует исходный файл (если он содержит синтаксические ошибки, генерируется исключение SyntaxError и объектмодуль в sys.modules не добавляется), пытается записать байт-компилированную версию и выполняет его (независимо от успешности записи байт-компилированной версии). Не перехваченные исключения во время инициализации прерывают процесс импортирования модуля. Однако частично инициализированный модуль остается в таблице sys.modules. Инициализация динамически подгружаемого или встроенного в интерпретатор модуля выполняется путем вызова функции initmodule.

Система запоминает модули, которые были инициализированы в словаре (индексированном именами модулей) sys.modules. При импортировании, если имя модуля найдено в sys.modules, его инициализация пропускается. Если Вы хотите заново

10.3. Простые инструкции

119

инициализировать модуль (например, чтобы не покидать интерпретатор после каждого внесения изменений в модуль при отладке), воспользуйтесь встроенной функцией reload().

Поиск модулей производится сначала среди встроенных в интерпретатор, затем в путях, хранящихся в списке sys.path. sys.path при запуске интерпретатора содержит текущий каталог, список каталогов из переменной окружения PYTHONPATH и зависящие от платформы пути по умолчанию. Если модуль с указанным именем не найден, генерируется исключение ImportError.

Импортируемые имена не должны использоваться в инструкции global в той же области видимости. В текущих реализациях такие имена просто не будут импортированы, однако в будущих версиях поведение может измениться.

Запись ‘from ... import *’ рекомендуется использовать только в глобальной области видимости.

Вы можете изменить поведение инструкции import, переопределив встроенную функцию __import__(). При этом будут полезны средства, определенные в модуле imp.

10.3.11 Инструкция exec

Инструкция ‘exec expression [in globals, [locals]]’ предназначена для динамического выполнения кода. Выражение expression должно давать объект типа code, string или file (открытый для чтения). Если expression является объектом кода, инструкция exec просто выполняет его. Строка или файл считаются содержащими инструкции языка Python, которые должны быть выполнены (если не содержат синтаксических ошибок).

Выражения globals и locals должны давать словари, которые будут использованы как глобальное и локальное пространства имен. Если аргументы опущены, код выполняется в текущей области видимости. Если указан только аргумент globals, он используется в качестве глобального и локального пространств имен. В текущих реализациях в эти словари автоматически добавляется запись (если такой нет) с ключом ’__builtins__’, ссылающаяся на словарь пространства встроенных имен (то есть, модуля __builtin__).

Динамическое вычисление выражений осуществляется с помощью встроенной функции eval(). Также могут быть полезны встроенные функции globals() и locals(), которые возвращают словари, соответствующие текущим глобальному и локальному пространствам имен.

В текущих реализациях многострочные составные инструкции должны заканчиваться переходом на новую строку. Так, ‘exec ’for i in (1,2):\n\tprint i\n’’ будет работать нормально, но при попытке выполнить ‘exec ’for i in (1,2):\n\tprint i’’ будет сгенерировано исключение SyntaxError.

120

Глава 10. Синтаксис и семантика

10.3.12Отладочные утверждения

Общепринятый способ включения в программу отладочных утверждений — инструкция ‘assert expression [, exc_arg]’. Если выражение expression ложно, генерируется исключение AssertionError. Если задан необязательный второй аргумент exc_arg, то он используется в качестве аргумента, передаваемого конструктору исключения. При компиляции с оптимизацией инструкции assert игнорируются.

Простая форма ‘assert expression’ эквивалентна конструкции (предполагается, что идентификаторы __debug__ и AssertionError ссылаются на встроенные переменные с такими именами; встроенная переменная __debug__ равна 1 при отключенной оптимизации)

if __debug__:

if not expression: raise AssertionError()

Расширенная форма ‘assert expression, exc_arg’ эквивалентна конструкции

if __debug__:

if not expression: raise AssertionError(exc_arg)

В качестве аргумента exc_arg можно, например, использовать строку, поясняющую возможную причину невыполнения утверждения. Заметим, что нет необходимости включать в нее исходный текст выражения expression, так как он в любом случае будет включен в выводимую (если исключение не перехвачено) отладочную информацию.

10.3.13Генерация исключений

Инструкция ‘raise [expr1 [, expr2 [, expr3]]]’ следует использовать в случае возникновения ошибок и других исключительных ситуаций. Без аргументов инструкция raise повторно генерирует последнее исключение, сгенерированное в текущей области видимости.

Иначе вычисляется значение выражения expr1, которое должно быть строкой, классом или экземпляром класса. Если задан второй аргумент (выражение expr2), вычисляется его значение, в противном случае подставляется None. Если первый аргумент является объектом-классом и второй аргумент является экземпляром этого или производного от него класса, expr2 используется в качестве генерируемого исключения. Если же второй аргумент не является таким экземпляром, он используется для инициализации класса expr1 следующим образом: если выражение expr2 является кортежем, то оно используется в качестве списка аргументов; если expr2 равно None, класс инициализируется с пустым списком аргументов; в остальных случаях expr2 используется как единственный аргумент при инициализации. Если же первый аргумент инструкции