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

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

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

101

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

Здесь также описаны встроенные функции и исключения — объекты, использование которых не требует предварительного импортирования. Их имена содержатся в отдельном пространстве имен, поиск в котором происходит в последнюю очередь. Таким образом, пользователь может переопределять их в локальном или глобальном пространстве имен.

102

Глава 10

Синтаксис и семантика

В настоящей главе описаны синтаксис и семантика различных конструкций языка Python. Формальное определение грамматики приведено в приложении B.

10.1Структура строк программы

10.1.1 Логические и физические строки

Программа на языке Python состоит из логических строк. Инструкции не могут быть разделены на несколько логических строк, за исключением составных инструкций. Логическая строка составляется из одной или нескольких физических строк, следуя правилам явного или подразумеваемого объединения строк. Отступ в физической строке, являющейся продолжением логической строки, не имеет значения.

Физическая строка заканчивается символом конца строки, принятым для данной платформы: ASCII символ LF для UNIX, последовательность CR LF для DOS и Windows, CR для Macintosh.

Комментарий начинается символом ‘#’, не являющимся частью строкового литерала, и заканчивается в конце физической строки. Комментарии лексическим анализатором игнорируются.

Две или более физических строки могут быть объединены в логическую строку явно с помощью символа обратной косой черты (‘\’): если физическая строка заканчивается символом обратной косой черты, который не является частью строкового литерала или комментария, она объединяется со следующей физической строкой, образуя одну логическую строку. Например:

if 1900 < year < 2100 and 1 <= month <= 12 \ and 1 <= day <= 31 and 0 <= hour < 24 \ and 0 <= minute < 60 and 0 <= second < 60:

# рПИПЦЕ ОБ РТБЧЙМШОХА ДБФХ return 1

Строка, заканчивающаяся символом обратной косой черты, не может содержать комментария. Лексемы не могут быть разделены на несколько строк, за исключением

10.1. Структура строк программы

103

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

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

month_names = [’сОЧБТШ’,

’ЖЕЧТБМШ’,

# оБЪЧБОЙС

’íÁÒÔ’,

’бРТЕМШ’,

# НЕУСГЕЧ ЗПДБ

’íÁÊ’,

’éÀÎØ’,

# РП-ТХУУЛЙ

’éÀÌØ’,

’бЧЗХУФ’,

 

’уЕОФСВТШ’,

’пЛФСВТШ’,

 

’оПСВТШ’,

’дЕЛБВТШ’]

 

Такие физические строки, объединяемые в одну логическую строку по правилам подразумеваемого объединения, могут содержать комментарии. Строковые литералы, записанные с использованием трех кавычек, также могут быть разделены на несколько физических строк, которые, однако, не могут содержать комментарии.

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

10.1.2 Отступы

Символы пробела и табуляции в начале логических строк используются для определения уровня отступа строки. Уровень отступа строк используется для объединения инструкций в группы.

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

Приведенный ниже пример имеет правильные, хотя и сбивающие с толку, отступы:

def perm(l):

# уПЪДБЕФ УРЙУПЛ ЧУЕИ ЧПЪНПЦОЩИ РЕТЕУФБОПЧПЛ Ч l if len(l) <= 1:

return [l]

r = []

for i in range(len(l)):

104

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

s = l[:i] + l[i+1:] p = perm(s)

for x in p: r.append(l[i:i+1] + x)

return r

Аследующий пример показывает возможные ошибки в отступах:

#ПЫЙВЛБ: ПФУФХР Ч РЕТЧПК УФТПЛЕ

def perm(l):

# ПЫЙВЛБ: ОЕФ ПФУФХРБ

for i in range(len(l)): s = l[:i] + l[i+1:]

# ПЫЙВЛБ: ОЕПЦЙДБООЩК ПФУФХР

p = perm(l[:i] + l[i+1:]) for x in p:

r.append(l[i:i+1] + x)

#ПЫЙВЛБ: РТЙ ХНЕОШЫЕОЙЙ ПФУФХРБ ДПМЦОБ УХЭЕУФЧПЧБФШ

#УФТПЛБ У ФПЮОП ФБЛЙН ЦЕ ПФУФХРПН

return r

Общепринято добавлять четыре пробела для каждого следующего уровня отступа. Использование символов табуляции не желательно, так как их интерпретация зависит от используемого редактора и его настроек. Большинство редакторов позволяют настроить автоматическую поддержку отступов. Если Вы работаете с редактором vim, достаточно добавить строчку ‘autocmd FileType python set softtabstop=4 shiftwidth=4 expandtab autoindent’ в конфигурационный файл редактора ‘.vimrc’ (‘_vimrc’ под Windows).

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

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

10.2 Выражения

Выражения состоят из атомов (“неделимых” частей), объединенных различными операторами. Описание операторов разделено на несколько подразделов, расположенных в порядке убывания приоритета описанных в них операторов (в конце этого раздела приведена сводная таблица приоритетов). Перед применением бинарных операторов операнды приводятся к общему типу по правилам, описанным в разделе 11.6.3. Назначение большинства операторов зависит от типа операндов и описано в соответствующих разделах главы 11.

10.2. Выражения

105

10.2.1 Атомы

Идентификаторы

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

Если к идентификатору привязан объект, его вычисление как атома в выражении дает этот объект. При попытке использования в выражении имени, не привязанного к объекту, будет сгенерировано исключение NameError.

Идентификаторы (имена) должны начинаться с буквы латинского алфавита или символа подчеркивания и содержать только буквы латинского алфавита, цифры и символы подчеркивания. Интерпретатор языка Python различает регистры букв: идентификаторы, например, spam и Spam считаются разными. Длина идентификаторов не ограничена.

Следующие идентификаторы являются зарезервированными (или ключевыми) словами языка и не могут быть использованы как обычные имена:

and

del

for

is

raise

assert

elif

from

lambda

return

break

else

global

not

try

class

except

if

or

while

continue

exec

import

pass

 

def

finally

in

print

 

Помимо ключевых слов, некоторые идентификаторы имеют специальное значение (символ ‘*’ обозначает “любое количество любых допустимых символов”; имена относятся к следующему классу, только если они не относятся к предыдущему):

__*__

Системные имена (особых модулей, специальных атрибутов и методов).

__* (только в определении класса)

Если идентификатор такого вида встречается в определении класса, то он считается частным атрибутом класса и подвергается специальному преобразованию. Например, имя ‘__spam’, определенное в классе с именем ‘Ham’, преобразуется к ‘_Ham_spam’. Преобразование производится независимо от контекста, в котором идентификатор используется. Если имя класса состоит только из символов подчеркивания, преобразование не производится.

106

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

_*

Частные объекты модуля, не импортируются инструкцией ‘from module import *’. В интерактивном режиме идентификатор с именем ‘_’ используется для хранения результата вычисления последней инструкции-выражения, сохраняется в пространстве встроенных имен. Не в интерактивном режиме имя ‘_’ не имеет специального значения (часто используется для выбора сообщений в соответствии с текущими национальными установками).

Литеральные выражения

Литеральные выражения являются записью значений некоторых встроенных типов: чисел различного типа (см. раздел 11.1), обычных строк (раздел 11.2.1) и строк Unicode (раздел 11.2.2).

“Замкнутые” выражения

Формы, заключенные в обратные кавычки и различные скобки также распознаются синтаксическим анализатором как атомы.

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

Квадратные и фигурные скобки используются для представления списков и словарей соответственно (см. разделы 11.2.6 и 11.3).

Обратные кавычки используются для получения строкового представления объекта, являющегося результатом вычисления заключенного в них выражения. Тот же результат Вы можете получить, используя встроенную функцию repr(). Смотрите также описание функции repr() (раздел 12) и специального метода __repr__() (раздел 11.6.3).

10.2.2 Первичные выражения

Первичное выражение может быть атомом или выражением, представляющим применение к первичному выражению (primary) следующих операций, имеющих наибольший приоритет:

primary.attr

Операция получения атрибута. Первичное выражение primary должно представ-

10.2. Выражения

107

лять объект, поддерживающий доступ к атрибутам. Если атрибут attr объекта primary не доступен, генерируется исключение AttributeError.

primary[key]

Операция получения элемента по индексу/ключу, характерная для последовательностей и отображений (см. разделы 11.2 и 11.3).

primary[slice_list]

Операция получения подпоследовательности по срезу. Последовательности встроенного типа поддерживают лишь простую запись среза (slice_list) в виде ‘[start]:[stop]’ (где start — нижняя и stop — верхняя границы). Расширенная запись (используется, например, в модулях расширения Numerical Python) позволяет указать через запятую несколько срезов вида ‘[start]:[stop][:[step]]’ (step — шаг) или использовать троеточие (‘...’). Например: ‘x[1:10:2]’, ‘x[:10, ...]’, ‘x[5:, ::2]’. Расширенная запись среза представляется с помощью специальных объектов slice и ellipsis, описанных в разделе 11.8.3.

primary(arg_list)

Операция вызова. Встроенные типы, поддерживающие вызов, перечислены в разделе 11.4. arg_list — список (через запятую) аргументов, которые могут быть переданы следующими способами (Вы можете использовать сразу несколько способов, однако порядок их следования в списке аргументов должен быть таким, в котором они здесь перечислены (exprN — произвольные выражения):

expr1 [, ...]

Простой способ передачи позиционных аргументов. Благодаря автоматической упаковке/распаковке кортежей, Вы можете использовать (только при таком способе передачи аргументов) подсписки аргументов:

>>>def print_vector(s, (x, y, z)):

>>>print s+’:’

>>>print ’x =’, x

>>>print ’y =’, y

>>>print ’z =’, z

...

>>>velocity = 0.0, 1.0, 1.0

>>>print_vector(’чЕЛФПТ УЛПТПУФЙ’, velocity) чЕЛФПТ УЛПТПУФЙ:

x = 0.0 y = 1.0 z = 1.0

name1 = expr1 [, ...]

Передача именованных аргументов. nameN — идентификаторы (имена) аргументов, exprN — их значения. Порядок следования именованных аргументов не имеет значения.

*seq

Передача списка (seq) позиционных аргументов. Позиционные аргументы, переданные обычным способом, дополняются элементами последовательности (любого типа) seq. Такой способ передачи позиционных аргументов доступен, начиная с версии 1.6.

108

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

**dict

Передача словаря (dict) именованных аргументов. Именованные аргументы, переданные обычным способом, дополняются записями из словаря dict. Такой способ передачи именованных аргументов доступен, начиная с версии 1.6.

Операция вызова всегда возвращает значение (возможно None), если выполнение не было прервано (например, сгенерировано исключение).

10.2.3Арифметические и битовые операторы

Ниже приведены все арифметические и битовые операторы в порядке уменьшения их приоритета. Операторы с одинаковым приоритетом объединены в группы.

x ** y

Оператор возведения в степень имеет больший приоритет, чем унарный арифметический или битовый оператор слева, но меньший, чем унарный арифметический или битовый оператор справа (во избежание нелепых ошибок использование оператора not справа от любого арифметического или битового оператора не допускается). Так, например, выражение ‘-x ** -y’ будет вычисляться справа налево, то есть эквивалентно выражению ‘-(x ** (-y))’.

+x, -x, ~x

x* y, x / y, x%y

x+ y, x - y

x<< y, x >> y

x& y

x^ y

x| y

10.2.4Условные операторы

Все условные операторы (операторы сравнения, проверки идентичности и вхождения) имеют одинаковый приоритет (больший, чем у логических операторов). Кро-

ме

того,

условные операторы могут быть записаны в цепь,

например, выражение

x

< y

<= z’ интерпретируется так же, как это принято в

математике, и эквива-

лентно ‘x < y and y <= z’, за исключением того, что y вычисляется только один раз (но в обоих случаях z не вычисляется, если выражение ‘x < y’ ложно).

Заметим, что конструкции типа ‘a < b > c’ вполне допустимы, однако выглядят довольно неприятно (сравнение между a и c не производится). Операторы != и <> полностью эквивалентны, использование первого предпочтительнее.

10.2. Выражения

109

Сравнение

x < y

1, если x меньше y, иначе 0.

x <= y

1, если x меньше или равен y, иначе 0.

x > y

1, если x больше y, иначе 0.

x >= y

1, если x больше или равен y, иначе 0.

x == y

1, если x равен y, иначе 0. x <> y

x != y

0, если x равен y, иначе 1. <> и != — две альтернативные формы записи одного оператора, вторая форма предпочтительнее.

Операторы сравнения работают со всеми типами данных. Вы можете сравнивать объекты разного типа. Переменные численных типов равны, если равны их значения. Если Вы сравниваете обычную строку и строку Unicode, к обычной строке сначала применяется встроенная функция unicode() (считается, что строка имеет кодировку ASCII, если обычная строка содержит символы с кодом больше 127, генерируется исключение UnicodeError). Для экземпляров классов может быть определен специальный метод __cmp__() (иногда также будет полезен метод __rcmp__(), см. раздел 11.6.3), который будет использоваться для реализации операторов <, <=, >, >=, ==, != (<>), в том числе, и с объектами других типов (следует помнить, что перед выполнением операций сравнения производится попытка привести операнды к общему типу). Во всех остальных случаях производится проверка идентичности: объекты равны, только если они являются одним и тем же объектом. Порядок следования при сортировке объектов, для которых не определена операция сравнения, определяется типом объектов и их идентификаторами1.

Идентичность

Операторы is и is not проверяют идентичность объектов: являются ли операнды на самом деле одним и тем же объектом (сравниваются идентификаторы объектов; см. также описание функции id() в разделе 12).

x is y

1, если x и y ссылаются на один и тот же объект, иначе 0.

1Возможны ситуации, при которых obj1 < obj2 и obj2 < obj3, но obj1 > obj3, например, если один из объектов является экземпляром, для которого не определен метод __cmp__().

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

x is not y

0, если x и y ссылаются на один и тот же объект, иначе 1.

Вхождение

Еще два условных оператора — in и not in — предназначены для определения, является ли объект элементом последовательности (или любого другого контейнера) и подробно описаны в разделе 11.2.

x in y

1, если y содержит элемент, который при сравнении (оператор ==) оказывается равным x, иначе 0.

x not in y

1, если y не содержит элемента равного x, иначе 0.

10.2.5Истинность

Для любого объекта можно проверить его истинность при использовании в инструкциях if и while или в качестве операнда логических операторов, описанных ниже. Следующие значения считаются ложью:

None;

ноль любого числового типа, например, 0, 0L, 0.0, 0j;

пустая последовательность, например, ’’, (), [];

пустое отображение (словарь) — {};

экземпляр класса, для которого определен метод __nonzero__() или __len__(), если он возвращает ноль. Дополнительную информацию об этих специальных методах Вы можете получить в разделе 11.6.3.

Все остальные значения считаются истинными — так что многие объекты всегда истинны.

10.2.6Логические операторы

Ниже приведены логические операторы в порядке уменьшения приоритета. Заметим, что оператор not имеет меньший приоритет, чем арифметические и условные операторы. То есть ‘not a == b’ интерпретируется как ‘not (a == b)’, а выражение ‘a == not b’ является синтаксической ошибкой.