Приоритет операций показан в нижеследующей таблице (в порядке уменьшения). Для унарных операций >x
обозначает операнд. Ассоциативность операций в Python — слева–направо, за исключением операции возведения в степень (>**
), которая ассоциативна справа налево.
Операция | Название |
---|
>lambda | лямбда–выражение |
>or | логическое ИЛИ |
>and | логическое И |
>not x | логическое НЕ |
>in , >not in | проверка принадлежности |
>is , >is not | проверка идентичности |
>< , ><= , >> , >>= , >!= , >== | сравнения |
>| | побитовое ИЛИ |
>^ | побитовое исключающее ИЛИ |
>& | побитовое И |
><< , >>> | побитовые сдвиги |
>+ , >- | сложение и вычитание |
>* , >/ , >% | умножение, деление, остаток |
>+x , >-x | унарный плюс и смена знака |
>~x | побитовое НЕ |
>** | возведение в степень |
>x.атрибут | ссылка на атрибут |
>x[индекс] | взятие элемента по индексу |
>x[от:до] | выделение среза (от и до) |
>f(аргумент, ...) | вызов функции |
>( ... ) | скобки или кортеж |
>[ ... ] | список или списковое включение |
>{кл:зн, ...} | словарь пар ключ–значение |
>`выражения` | преобразование к строке (repr) |
Таким образом, порядок вычислений операндов определяется такими правилами:
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) нет операции присваивания, поэтому синтаксически перед знаком