Глава
2
.
Лексические и синтаксические
соглашения
В этой главе рассматриваются синтаксические и лексические соглашения, используемые в программах на языке Python. Здесь мы познакомимся со структурой строки, способами группировки инструкций, зарезервирован- ными словами, литералами, операторами, лексемами и кодировками сим- волов в исходных текстах.
Структура строк и отступы
Каждая инструкция в программе завершается символом перевода строки.
Длинные инструкции допускается располагать в нескольких строках, ис- пользуя символ продолжения строки (\), как показано ниже:
a = math.cos(3 * (x - n)) + \
math.sin(3 * (y - n))
Символ продолжения строки не используется внутри строк в тройных ка- вычках, в определениях списков, кортежей или словарей. В общем случае любая часть программы, заключенная в круглые (...), квадратные [...], фигурные {...} скобки или в тройные кавычки, может занимать несколько строк без применения символа продолжения строки, потому что в данных случаях явно обозначены начало и конец блока определения.
Отступы используются для отделения различных блоков программного кода, таких как тело функции, условного оператора, цикла или опреде- ления класса. Величина отступа для первой инструкции в блоке может выбираться произвольно, но отступы всех остальных инструкций в блоке должны быть равны отступу в первой инструкции. Например:
if a:
инструкция1 # Правильное оформление отступов инструкция2
Идентификаторы и зарезервированные слова
49else:
инструкция3
инструкция4 # Неправильное оформление отступов (ошибка)
Е
сли тело функции, цикла, условного оператора или определения класса достаточно короткое и содержит единственную инструкцию, его можно по- местить в той же самой строке, например:
if a: инструкция1
else: инструкция2
Для обозначения пустого тела или блока используется инструкция pass.
Например:
if a:
pass else:
инструкции
Для оформления отступов допускается использовать символы табуляции, однако такая практика не приветствуется. Для этих целей в сообществе Py-
Py- thon предпочитают (и рекомендуется) использовать символы пробела. Когда интерпретатор Python
встречает символы табуляции, он замещает их сим-
Python встречает символы табуляции, он замещает их сим- встречает символы табуляции, он замещает их сим- волами пробела до ближайшей позиции в строке, с порядковым номером, кратным 8 (например, когда интерпретатор встречает символ табуляции в позиции с номером 11, он замещает его символами пробела до позиции с номером 16). Если интерпретатор Python запустить с ключом -t, он будет выводить предупреждающие сообщения, когда ему будут встречаться стро- ки, где отступы в одном и том же блоке кода оформлены неодинаковой сме- сью из символов пробелов и табуляции. Если использовать ключ -tt, вместо предупреждающих сообщений будет возбуждаться исключение TabError.
Допускается размещать в одной строке программы сразу несколько инструк- ций, при этом они должны отделяться друг от друга точкой с запятой (;).
Строки, содержащие единственную инструкцию, также могут завершаться точкой с запятой, хотя это и не является обязательным требованием.
Символ # отмечает начало комментария, простирающегося до конца стро- ки. Однако, если символ # встречается внутри строки в кавычках, он не воспринимается как начало комментария.
Наконец, интерпретатор игнорирует все пустые строки, если он запущен не в интерактивном режиме. Ввод пустой строки в интерактивном режиме интерпретируется как окончание ввода многострочной инструкции.
Идентификаторы и зарезервированные словаИдентификаторы – это имена, используемые для идентификации пере- менных, функций, классов, модулей и других объектов. Идентификаторы могут включать алфавитно-цифровые символы и символ подчеркивания
(_), но при этом они не могут начинаться с цифрового символа. В качестве
50Глава 2. Лексические и синтаксические соглашения алфавитных символов в настоящее время допускается использовать толь- ко символы A–Z и a–z из набора ISO-Latin. Идентификаторы чувствитель-
A–Z и a–z из набора ISO-Latin. Идентификаторы чувствитель-
–Z и a–z из набора ISO-Latin. Идентификаторы чувствитель-
Z и a–z из набора ISO-Latin. Идентификаторы чувствитель- и a–z из набора ISO-Latin. Идентификаторы чувствитель- a–z из набора ISO-Latin. Идентификаторы чувствитель-
–z из набора ISO-Latin. Идентификаторы чувствитель- z из набора ISO-Latin. Идентификаторы чувствитель- из набора ISO-Latin. Идентификаторы чувствитель-
ISO-Latin. Идентификаторы чувствитель-
-Latin. Идентификаторы чувствитель-
Latin. Идентификаторы чувствитель-
. Идентификаторы чувствитель- ны к регистру символов, поэтому имена FOO и foo считаются различными.
В идентификаторах не допускается использовать специальные символы, такие как $, % и @. Кроме того, такие слова, как if, else и for являются заре- зервированными и не могут использоваться в качестве идентификаторов.
В следующем списке перечислены все зарезервированные слова:
and del from nonlocal try as elif global not while assert else if or with break except import pass yield class exec in print continue finally is raise def for lambda return
Идентификаторы, начинающиеся или оканчивающиеся символом подчер- кивания, часто имеют особый смысл. Например, идентификаторы, начи-
нающиеся с одного символа подчеркивания, такие как _foo, не импортиру- ются инструкцией from module import *. Идентификаторы, начинающиеся и оканчивающиеся двумя символами подчеркивания, такие как __init__, зарезервированы для имен специальных методов. Идентификаторы, начи- нающиеся двумя символами подчеркивания, такие как __bar, используют- ся для реализации частных методов и атрибутов классов, о чем подробно рассказывается в главе 7 «Классы и объектно-ориентированное програм- мирование». В общем случае следует избегать использования одинаковых идентификаторов.
Числовые литералыВ языке Python существует четыре встроенных типа числовых литералов:
• Булевы значения
• Целые числа
• Числа с плавающей точкой
• Комплексные числа
Идентификаторы True и False интерпретируются как логические значения, имеющие числовое выражение 1 и 0 соответственно. Такие числа, как 1234, интерпретируются как десятичные целые числа. Чтобы определить чис- ло в восьмеричной, шестнадцатеричной или двоичной форме, необходимо задать префикс 0, 0x или 0b соответственно (например, 0644, 0x100fea8 или
0b11101010
).
Целые числа в языке Python могут содержать произвольное количество цифр, поэтому, если потребуется записать очень большое число, достаточно просто указать все цифры, составляющие его, например: 12345678901234567890.
Строковые литералы
51Однако при инспектировании таких значений
1
и в старом программном коде можно заметить, что большие числа оканчиваются символом l (символ
L
в нижнем регистре) или L, например: 12345678901234567890L. Наличие это- го символа L связано с тем, что интерпретатор Python представляет целые числа как целые значения с фиксированной точностью, ограниченной аппа- ратными возможностями, или как целые числа с произвольной точностью, в зависимости от величины значения. В ранних версиях Python, чтобы определить большое число, необходимо было явно добавить завершающий символ L. В настоящее время делать это не требуется и даже не рекоменду- ется. Поэтому, при
необходимости определить большое числовое значение, достаточно просто записать его (без символа L).
Такие числа, как 123.34 и 1.2334e+02, интерпретируются как числа с плава- ющей точкой. Целые числа и числа с плавающей точкой, завершающиеся символом j или J, такие как 12.34J, рассматриваются как мнимые части комплексных чисел. Комплексные числа, состоящие из действительной и мнимой частей, определяются как сумма действительного и мнимого числа: 1.2 + 12.34J.
Строковые литералыСтроковые литералы используются для определения последовательностей символов и оформляются как текст, заключенный в апострофы (‘), кавыч- ки (“) или тройные кавычки (‘’’ или “””). Нет никакой разницы, какие ка- вычки использовать, главное, чтобы совпадал тип кавычек в начале и в конце строкового литерала. Определения строковых литералов в апостро- фах и в кавычках должны занимать не более одной строки, тогда как ли- тералы в тройных кавычках могут занимать несколько строк и могут со- держать все символы форматирования (то есть символы перевода строки, табуляции, пробелы и так далее). Соседние строковые литералы (которые отделяются друг от друга пробелом, символом перевода строки или симво- лом продолжения строки), такие как “hello” ‘world’, при выполнении про- граммы объединяются в одну строку, например: “helloworld”.
Внутри строковых литералов символ обратного слэша (\) используется для экранирования специальных символов, таких как перевод строки, сам символ обратного слэша, кавычек и непечатаемых символов. Все до- пустимые экранированные последовательности символов перечислены в табл. 2.1. Неопознанные экранированные последовательности остаются в строке в неизменном виде и включают ведущий символ обратного слэша.
Таблица 2.1. Стандартные экранированные последовательностиСимвол_Описание_\Символ_продолжения_строки\\Символ_обратного_слэша\’Апостроф1Например,_функцией_repr()._–_Прим._перев.__52'>СимволОписание\
Символ продолжения строки
\\
Символ обратного слэша
\’
Апостроф
1
Например, функцией repr(). –
Прим. перев. 52Глава 2. Лексические и синтаксические соглашения
СимволОписание\”
Кавычка
\a
Сигнал
\b
Забой
\e
Экранирующий символ
\0
Пустой символ
\n
Перевод строки
\v
Вертикальная табуляция
\t
Горизонтальная табуляция
\r
Возврат каретки
\f
Перевод формата
\
OOOВосьмеричное значение (от \000 до \377)
\u
xxxxСимвол Юникода (от \u0000 до \uffff)
\U
xxxxxxxxСимвол Юникода (от \U00000000 до \Uffffffff)
\N{
имя символа}
Символ Юникода с указанным именем
\xhh
Шестнадцатеричное значение (от \x00 до \xff)
Экранированные последовательности \OOO и \x используются для вставки в строковые литералы символов, которые сложно ввести с клавиатуры (то
есть управляющие символы, непечатаемые символы, псевдографические символы, символы из национальных алфавитов и так далее). В этих экра- нированных последовательностях должны указываться целочисленные значения, соответствующие кодам символов. Например, если потребуется определить строковый литерал со словом «Jalape
ño», его можно записать, как “Jalape\xf1o”, где \xf1 – это код символа
ñ.
В версии Python 2 строковые литералы могут содержать только 8-битные символы. Серьезным ограничением таких строковых литералов является отсутствие полноценной поддержки национальных символов и Юникода.
Для преодоления этого ограничения в Python 2 используется отдельный строковый тип. Чтобы записать строковый литерал, содержащий символы
Юникода, необходимо добавить префикс u перед открывающей кавычкой.
Например:
s = u”Jalape\u00f1o”
В Python 3 этот префикс можно не указывать (в действительности его на-
Python 3 этот префикс можно не указывать (в действительности его на-
3 этот префикс можно не указывать (в действительности его на- личие приводит к синтаксической ошибке), поскольку все строки уже ин- терпретируются как строки Юникода. В версии Python 2 это поведение можно имитировать, если вызвать интерпретатор с ключом -U (в этом слу- чае все строковые литералы будут интерпретироваться как строки Юнико- да, и префикс u можно опустить).
Таблица 2.1 (продолжение) Строковые литералы
53Не зависимо от используемой версии Python экранированные последова-
Python экранированные последова- экранированные последова- тельности \u, \U и \N из табл. 2.1 могут использоваться для вставки про- извольных символов в строковые литералы Юникода. Каждому символу
Юникода присвоен свой
кодовый пункт, который обычно может быть за- писан как U+
XXXX, где
XXXX – последовательность из четырех или более шест- надцатеричных цифр. (Обратите внимание: такая форма записи не имеет отношения к синтаксису языка Python, но часто используется для описа-
Python, но часто используется для описа-
, но часто используется для описа- ния символов Юникода.) Например, символ с имеет кодовый пункт U+00F1.
Экранированная последовательность \u используется для вставки сим- волов Юникода с кодовыми пунктами в диапазоне от U+0000 до U+FFFF (на- пример, \u00f1). Экранированная последовательность \U используется для вставки символов Юникода с кодовыми пунктами от U+10000 и выше (на- пример, \U00012345). Относительно экранированной последовательности \U важно отметить, что символы Юникода с кодовыми пунктами выше U+10000 обычно могут быть представлены в виде пары символов, которая называет- ся
суррогатной парой. Эта тема касается внутреннего представления строк
Юникода и подробно рассматривается в главе 3 «Типы данных и объекты».
Кроме того, символы Юникода имеют описательные имена. Если имя сим- вола известно, можно использовать экранированную последовательность
\N{
имя символа}
. Например:
s = u”Jalape\N{LATIN SMALL LETTER N WITH TILDE}o”
Исчерпывающий справочник по кодовым пунктам и именам символов можно найти по адресу
http://www.unicode.org/charts.
Дополнительно строковые литералы могут предваряться префиксом r или
R
, например: r’\d’. Такие строки называют «сырыми», так как в них сим- волы обратного слэша не имеют специального значения, то есть в таких строках никакие символы не интерпретируются особым образом, включая и символы обратного слэша. Основное назначение «сырых» строк состоит в том, чтобы обеспечить возможность определения строковых литералов, где символы обратного слэша могут иметь какой-то другой смысл. В каче- стве примеров можно привести регулярные выражения, используемые мо- дулем re, или имена файлов в операционной системе Windows (например, r’c:\newdata\tests’
).
«Сырые» строки не могут состоять из единственного символа обратного слэша, r”\”. Внутри «сырых» строк экранированные последовательности вида \u
XXXX по-прежнему интерпретируются как символы Юникода при условии, что последовательность, следующая за символом \, может интер- претироваться как кодовый пункт. Например, литерал ur”\u1234” опреде- ляет «сырую» строку Юникода с единственным символом U+1234, тогда как литерал ur”\\u1234”
определяет строку из семи символов, где первые два символа – это символы обратного слэша, а остальные пять – литерал
“u1234”
. Кроме того, в определениях «сырых» строк Юникода в версии Py-
Py- thon 2.2 префикс r должен следовать за префиксом u, как показано в при- мерах. В Python 3.0 префикс u указывать не требуется.
Строковые литералы не должны содержать определения символов в виде последовательностей байтов, соответствующих символам в определенной
54
Глава 2. Лексические и синтаксические соглашения кодировке, такой как UTF-8 или UTF-16. Например, при попытке вывести
«сырую» строку в кодировке UTF-8, например ‘Jalape\xc3\xb1o’, будет выве- дена строка из девяти символов U+004A, U+0061, U+006C, U+0061, U+0070, U+0065,
U+00C3
, U+00B1, U+006F, что, вероятно, не совсем соответствует ожиданиям.
Дело в том, что в кодировке UTF-8 двухбайтовая последовательность \xc3\
xb1
должна представлять символ U+00F1, а не два символа U+00C3 и U+00B1.
Чтобы определить литерал в виде кодированной последовательности бай- тов, необходимо добавить префикс “b”, например: b”Jalape\xc3\xb1o”. В этом случае создается строковый литерал, состоящий из последовательности от- дельных байтов. Эту последовательность можно преобразовать в обычную строку, декодировав значение литерала с байтовыми данными с помощью метода decode(). Подробнее об этом рассказывается в главе 3 и в главе 4
«Операторы и выражения».
Надобность в байтовых литералах возникает крайне редко, поэтому дан- ный синтаксис отсутствует в версиях ниже Python 2.6, но и в этой версии не делается различий между байтовыми литералами и строками. Однако в Python 3 байтовые литералы отображаются в новый тип данных bytes, который по своему поведению отличается от обычных строк (см. приложе- ние A, «Python 3»).
Контейнеры
Значения, заключенные в квадратные [...], круглые (...) или фигурные {...} скобки, обозначают коллекции объектов, представленные в виде списка, кортежа или словаря соответственно, как показано в следующем примере:
a = [ 1, 3.4, ‘hello’ ] # Список b = ( 10, 20, 30 ) # Кортеж c = { ‘a’: 3, ‘b’: 42 } # Словарь
Литералы списков, кортежей и словарей могут располагаться в несколь- ких строках программы, без использования символа продолжения строки
(\). Кроме того, допускается оставлять завершающую запятую после по- следнего элемента. Например:
a = [ 1,
3.4,
‘hello’,
]
Операторы, разделители
и специальные символы
В языке Python имеются следующие операторы:
+
-
*
**
/
//
%
<<
>>
&
|
^
<
>
<=
>=
==
!=
<>
+=
-=
*=
/=
//=
%=
**=
&=
|=
^=
>>=
<<=
Строки документирования
55Следующие лексемы играют роль разделителей в выражениях, списках, словарях и в различных частях инструкций:
( ) [ ] { } , : . ` = ;
Например, знак равенства (=) отделяет имя и значение в операциях присва- ивания, а запятая (,) используется для
разделения аргументов при вызовах функций, элементов в списках и кортежах и так далее. Точка (.) использу- ется в определениях чисел с плавающей точкой, а многоточие (...) – в рас- ширенных операциях со срезами.
Наконец, следующие символы также имеют специальное назначение:
‘ “ # \ @
Символы $ и ? не имеют специального назначения и не могут присутство- вать в программном коде, за исключением строковых литералов.
Строки документированияЕсли первой инструкцией в определении модуля, класса или функции яв- ляется строка, она становится строкой документирования, описывающей соответствующий объект, как показано в следующем примере:
def fact(n):
“Эта функция находит факториал числа”
if (n <= 1): return 1
else: return n * fact(n - 1)
Строки документирования иногда используются инструментами просмо- тра программного кода и автоматического создания документации. Эти строки доступны в виде атрибута __doc__ объектов, например:
>>>
print fact._ _doc__Эта функция находит факториал числа
>>>
К строкам документирования применяются те же самые правила оформ- ления отступов, что и для других инструкций в определении. Кроме того, строка документирования не может быть вычисляемой или извлекаться из переменной. Строка документирования всегда определяется как строко- вый литерал.
ДекораторыОпределениям функций, методов или классов может предшествовать спе- циальный символ, известный как
декоратор, цель которого состоит в том, чтобы изменить поведение определения, следующего за ним. Декораторы начинаются с символа @ и должны располагаться в отдельной строке, не- посредственно перед соответствующей функцией, методом или классом.
Например:
56Глава 2. Лексические и синтаксические соглашения class Foo(object):
@staticmethod def bar():
pass
Допускается указывать несколько декораторов, но каждый из них должен находиться в отдельной строке. Например:
@foo
@bar def spam():
pass
Дополнительную информацию о декораторах можно найти в главе 6
«Функции и функциональное программирование» и в главе 7 «Классы и объектно-ориентированное программирование».
Кодировка символов в исходных текстахИсходные тексты программ на языке Python обычно записываются в стан-
Python обычно записываются в стан- обычно записываются в стан- дартной 7-битовой кодировке ASCII.
Однако пользователи, работающие в среде с поддержкой Юникода, могут посчитать это ограничение неудоб- ным, особенно когда возникает необходимость в создании большого коли- чества строковых литералов с национальными символами.
Язык Python позволяет записывать программный код в другой кодировке, для чего в первой или во второй строке программы необходимо добавить специальный комментарий, указывающий тип кодировки:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
ёё
s = “Jalape
ño” # Строка в кавычках записана непосредственно в кодировке UTF-8.
При наличии специального комментария coding: строковые литералы мо- гут вводиться непосредственно с клавиатуры, с помощью текстового редак- тора, поддерживающего требуемую кодировку. Однако другие элементы программы на языке Python, включая идентификаторы и зарезервирован-
Python, включая идентификаторы и зарезервирован-
, включая идентификаторы и зарезервирован- ные слова, должны содержать только символы ASCII.