Выбрать главу

Таким образом, порядок вычислений операндов определяется такими правилами:

1. Операнд слева вычисляется раньше операнда справа во всех бинарных операциях, кроме возведения в степень.

2. Цепочка сравнений вида a < b < c ... y < z фактически равносильна: (а < b) and (b < c) and ... and (y < z).

3. Перед фактическим выполнением операции вычисляются нужные для нее операнды. В большинстве бинарных операций предварительно вычисляются оба операнда (сначала левый), но операции or и and, а также цепочки сравнений вычисляют такое количество операндов, которое достаточно для получения результата. В невычисленной части выражения в таком случае могут даже быть неопределенные имена. Это важно учитывать, если используются функции с побочными эффектами.

4. Аргументы функций, выражения для списков, кортежей, словарей и т.п. вычисляются слева–направо, в порядке следования в выражении.

В случае неясности приоритетов желательно применять скобки. Несмотря на то, что одни и те же символы могут использоваться для разных операций, приоритеты операций не меняются. Так, % имеет тот же приоритет, что и *, а потому в следующем примере скобки просто необходимы, чтобы операция умножения произошла перед операцией форматирования:

print "%i" % (i*j)

Выражения могут фигурировать во многих операторах Python и даже как самостоятельный оператор. У выражения всегда есть результат, хотя в некоторых случаях (когда выражение вычисляется ради побочных эффектов) этот результат может быть «ничем» — None.

Очень часто выражения стоят в правой части оператора присваивания или расширенного присваивания. В Python (в отличие, скажем, от C) нет операции присваивания, поэтому синтаксически перед знаком = могут стоять только идентификатор, индекс, срез, доступ к атрибуту или кортеж (список) из перечисленного. (Подробности в документации).

Имена

Об именах (идентификаторах) говорилось уже не раз, тем не менее, необходимо сказать несколько слов об их применении в языке Python.

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

>>> import keyword

>>> keyword.kwlist

['and', 'assert', 'break', 'class', 'continue', 'def', 'del',

'elif', 'else', 'except', 'exec', 'finally', 'for', 'from',

'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or',

'pass', 'print', 'raise', 'return', 'try', 'while', 'yield']

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

В каждой точке программы интерпретатор «видит» три пространства имен: локальное, глобальное и встроенное. Пространство имен — отображение из имен в объекты.

Для понимания того, как Python находит значение некоторой переменной, необходимо ввести понятие блока кода. В Python блоком кода является то, что исполняется как единое целое, например, тело определения функции, класса или модуля.

Локальные имена — имена, которым присвоено значение в данном блоке кода. Глобальные имена — имена, определяемые на уровне блока кода определения модуля или те, которые явно заданы в операторе global. Встроенные имена — имена из специального словаря __builtins__.

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