expressions.md
1> **Источник:** https://python-all.ru/3.4/reference/expressions.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 6. Выражения89В этой главе объясняется значение элементов выражений в Python.1011**Примечания к синтаксису:** В этой и следующих главах для описания синтаксиса, а не лексического анализа, будет использоваться расширенная нотация БНФ. Когда (одна из альтернатив) синтаксического правила имеет вид1213```1415name ::= othername16```1718и если семантика не указана, то семантика такой формы `name` такая же, как для `othername`.1920## 6.1. Арифметические преобразования2122Когда в описании арифметического оператора ниже используется фраза «числовые аргументы преобразуются к общему типу», это означает, что реализация оператора для встроенных типов работает следующим образом:2324- Если хотя бы один аргумент – комплексное число, другой преобразуется в комплексное;25- в противном случае, если хотя бы один аргумент является числом с плавающей запятой, другой преобразуется в число с плавающей запятой;26- в противном случае оба должны быть целыми числами, и преобразование не требуется.2728Для некоторых операторов применяются дополнительные правила (например, строка в качестве левого аргумента оператора «%»). Расширения должны определять собственное поведение преобразования.2930## 6.2. Атомы3132Атомы – это самые базовые элементы выражений. Простейшие атомы – идентификаторы или литералы. Формы, заключённые в круглые, квадратные или фигурные скобки, также синтаксически относятся к атомам. Синтаксис атомов:3334```3536atom ::= identifier | literal | enclosure37enclosure ::= parenth_form | list_display | dict_display | set_display38 | generator_expression | yield_atom39```4041### 6.2.1. Идентификаторы (имена)4243Идентификатор, выступающий в роли атома, является именем. См. раздел [*Идентификаторы и ключевые слова*](https://python-all.ru/3.4/reference/lexical_analysis.html#identifiers) для лексического определения и раздел [*Именование и связывание*](https://python-all.ru/3.4/reference/executionmodel.html#naming) для документации по именованию и связыванию.4445Когда имя привязано к объекту, вычисление атома возвращает этот объект. Когда имя не привязано, попытка его вычисления вызывает исключение [`NameError`](https://python-all.ru/3.4/library/exceptions.html#NameError).4647**Искажение приватных имён:** Когда идентификатор, который текстуально встречается в определении класса, начинается с двух или более символов подчёркивания и не заканчивается двумя или более подчёркиваниями, он считается *приватным именем* этого класса. Приватные имена преобразуются в более длинную форму до генерации кода для них. Это преобразование вставляет имя класса, с удалёнными ведущими подчёркиваниями и одним вставленным подчёркиванием, перед именем. Например, идентификатор `__spam`, встречающийся в классе с именем `Ham`, будет преобразован в `_Ham__spam`. Это преобразование не зависит от синтаксического контекста, в котором используется идентификатор. Если преобразованное имя слишком длинное (длиннее 255 символов), может произойти усечение, определённое реализацией. Если имя класса состоит только из подчёркиваний, преобразование не выполняется.4849### 6.2.2. Литералы5051Python поддерживает строковые литералы, литералы bytes и различные числовые литералы:5253```5455literal ::= stringliteral | bytesliteral56 | integer | floatnumber | imagnumber57```5859Вычисление литерала даёт объект указанного типа (строка, bytes, целое число, число с плавающей запятой, комплексное число) с указанным значением. Значение может быть приближённым для литералов с плавающей запятой и мнимых (комплексных). Подробнее см. раздел [*Литералы*](https://python-all.ru/3.4/reference/lexical_analysis.html#literals).6061Все литералы соответствуют неизменяемым типам данных, поэтому тождественность объекта менее важна, чем его значение. При многократном вычислении литералов с одинаковым значением (одного и того же или разных вхождений в тексте программы) может получаться как один и тот же объект, так и разные объекты с одним и тем же значением.6263### 6.2.3. Формы в скобках6465Выражение в скобках – это необязательный список выражений, заключённый в круглые скобки:6667```6869parenth_form ::= "(" [expression_list] ")"70```7172Вычисление списка выражений в скобках даёт результат этого списка: если список содержит хотя бы одну запятую, получается кортеж; в противном случае – единственное выражение, из которого состоит список.7374Пустая пара круглых скобок создаёт пустой объект кортежа. Поскольку кортежи неизменяемы, применяются правила для литералов (т.е. два вхождения пустого кортежа могут давать один и тот же объект или нет).7576Обратите внимание, что кортежи образуются не круглыми скобками, а использованием оператора запятой. Исключением является пустой кортеж, для которого круглые скобки *требуются* – разрешение «ничего» без скобок в выражениях привело бы к неоднозначностям и позволило бы распространённым опечаткам остаться незамеченными.7778### 6.2.4. Отображения списков, множеств и словарей7980Для создания списка, множества или словаря в Python предусмотрен специальный синтаксис, называемый «отображениями» (displays); каждый из них существует в двух вариантах:8182- либо содержимое контейнера перечисляется явно, либо83- они вычисляются с помощью набора инструкций циклов и фильтрации, называемого *включением (comprehension)*.8485Общие синтаксические элементы для включений:8687```8889comprehension ::= expression comp_for90comp_for ::= "for" target_list "in" or_test [comp_iter]91comp_iter ::= comp_for | comp_if92comp_if ::= "if" expression_nocond [comp_iter]93```9495Генератор коллекции состоит из одного выражения, за которым следует как минимум одно предложение [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) и ноль или более предложений [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) или [`if`](https://python-all.ru/3.4/reference/compound_stmts.html#if). В этом случае элементами нового контейнера будут те, которые получаются при рассмотрении каждого из предложений [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) или [`if`](https://python-all.ru/3.4/reference/compound_stmts.html#if) как блока, вложенных слева направо, и вычислении выражения для получения элемента каждый раз, когда достигается самый внутренний блок.9697Обратите внимание, что включение выполняется в отдельной области видимости, поэтому имена, присвоенные в списке целей, не «просачиваются» в окружающую область видимости.9899### 6.2.5. Отображения списков100101Списковое отображение – это возможно пустая последовательность выражений, заключённая в квадратные скобки:102103```104105list_display ::= "[" [expression_list | comprehension] "]"106```107108Списковое отображение возвращает новый объект списка, содержимое которого задаётся либо списком выражений, либо включением. Если предоставлен разделённый запятыми список выражений, его элементы вычисляются слева направо и помещаются в объект списка в том же порядке. Если предоставлено включение, список строится из элементов, полученных в результате включения.109110### 6.2.6. Отображения множеств111112Множественное отображение обозначается фигурными скобками и отличается от словарных отображений отсутствием двоеточий, разделяющих ключи и значения:113114```115116set_display ::= "{" (expression_list | comprehension) "}"117```118119Множественное отображение возвращает новый изменяемый объект множества, содержимое которого задаётся либо последовательностью выражений, либо включением. Если предоставлен разделённый запятыми список выражений, его элементы вычисляются слева направо и добавляются в объект множества. Если предоставлено включение, множество строится из элементов, полученных в результате включения.120121Пустое множество нельзя создать с помощью `{}`; этот литерал создаёт пустой словарь.122123### 6.2.7. Отображения словарей124125Отображение словаря – это возможно пустая последовательность пар ключ/значение, заключённая в фигурные скобки:126127```128129dict_display ::= "{" [key_datum_list | dict_comprehension] "}"130key_datum_list ::= key_datum ("," key_datum)* [","]131key_datum ::= expression ":" expression132dict_comprehension ::= expression ":" expression comp_for133```134135Словарное отображение возвращает новый объект словаря.136137Если задана разделённая запятыми последовательность пар ключ/значение, они вычисляются слева направо для определения записей словаря: каждый объект ключа используется как ключ в словаре для хранения соответствующего значения. Это означает, что можно указать один и тот же ключ несколько раз в списке ключ/значение, и итоговое значение словаря для этого ключа будет последним указанным.138139Словарное включение, в отличие от списковых и множественных включений, требует двух выражений, разделённых двоеточием, после которых следуют обычные предложения «for» и «if». При выполнении включения результирующие элементы ключей и значений вставляются в новый словарь в порядке их получения.140141Ограничения на типы ключей перечислены ранее в разделе [*Стандартная иерархия типов*](https://python-all.ru/3.4/reference/datamodel.html#types). (Кратко: тип ключа должен быть [*хешируемым*](https://python-all.ru/3.4/glossary.html#term-hashable), что исключает все изменяемые объекты.) Конфликты между дублирующимися ключами не обнаруживаются; последнее значение (текстуально самое правое в отображении), сохранённое для данного ключа, побеждает.142143### 6.2.8. Генераторные выражения144145Генераторное выражение – это компактная запись генератора в круглых скобках:146147```148149generator_expression ::= "(" expression comp_for ")"150```151152Генераторное выражение возвращает новый объект-генератор. Его синтаксис такой же, как у включений, за исключением того, что оно заключается в круглые скобки вместо квадратных или фигурных.153154Переменные, используемые в генераторном выражении, вычисляются лениво при вызове метода [`__next__()`](https://python-all.ru/3.4/reference/expressions.html#generator.__next__) для объекта-генератора (так же, как в обычных генераторах). Однако крайнее левое предложение [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) вычисляется сразу, чтобы ошибка, возникшая в нём, была видна до любых других возможных ошибок в коде, обрабатывающем генераторное выражение. Последующие предложения [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) не могут быть вычислены немедленно, так как они могут зависеть от предыдущего цикла [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for). Например: `(x*y for x in range(10) for y in bar(x))`.155156Круглые скобки можно опускать при вызовах с одним аргументом. Подробнее см. раздел [*Вызовы*](https://python-all.ru/3.4/reference/expressions.html#calls).157158### 6.2.9. Выражения yield159160```161162yield_atom ::= "(" yield_expression ")"163yield_expression ::= "yield" [expression_list | "from" expression]164```165166Выражение yield используется только при определении [*функции-генератора*](https://python-all.ru/3.4/glossary.html#term-generator) и, следовательно, может использоваться только в теле определения функции. Использование yield выражения в теле функции превращает эту функцию в генератор.167168При вызове генераторной функции она возвращает итератор, известный как генератор. Этот генератор затем управляет выполнением генераторной функции. Выполнение начинается при вызове одного из методов генератора. В этот момент выполнение переходит к первому выражению yield, где оно снова приостанавливается, возвращая значение [`expression_list`](https://python-all.ru/3.4/reference/expressions.html#grammar-token-expression_list) вызывающему генератора. Под «приостановлено» мы подразумеваем, что сохраняется всё локальное состояние, включая текущие привязки локальных переменных, указатель инструкции, внутренний стек вычислений и состояние обработки исключений. Когда выполнение возобновляется вызовом одного из методов генератора, функция продолжает работу точно так же, как если бы выражение yield было просто ещё одним внешним вызовом. Значение выражения yield после возобновления зависит от метода, который возобновил выполнение. Если используется [`__next__()`](https://python-all.ru/3.4/reference/expressions.html#generator.__next__) (обычно через [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) или встроенную функцию [`next()`](https://python-all.ru/3.4/library/functions.html#next)), то результатом будет [`None`](https://python-all.ru/3.4/library/constants.html#None). В противном случае, если используется [`send()`](https://python-all.ru/3.4/reference/expressions.html#generator.send), то результатом будет значение, переданное этому методу.169170Всё это делает функции-генераторы весьма похожими на корутины; они могут выдавать значения несколько раз, имеют более одной точки входа, и их выполнение может быть приостановлено. Единственное отличие в том, что функция-генератор не может управлять тем, где должно продолжиться выполнение после yield; управление всегда передаётся вызывающему generator.171172Выражения yield допускаются в любом месте конструкции [`try`](https://python-all.ru/3.4/reference/compound_stmts.html#try). Если генератор не возобновлён до того, как он будет финализирован (при достижении нулевого счётчика ссылок или при сборке мусора), будет вызван метод [`close()`](https://python-all.ru/3.4/reference/expressions.html#generator.close) итератора-генератора, что позволит выполнить все отложенные предложения [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally).173174При использовании `yield from <expr>` переданное выражение рассматривается как под-итератор. Все значения, порождаемые этим под-итератором, передаются напрямую вызывающему методов текущего генератора. Любые значения, переданные через [`send()`](https://python-all.ru/3.4/reference/expressions.html#generator.send), и любые исключения, переданные через [`throw()`](https://python-all.ru/3.4/reference/expressions.html#generator.throw), передаются нижележащему итератору, если он имеет соответствующие методы. Если это не так, то [`send()`](https://python-all.ru/3.4/reference/expressions.html#generator.send) вызовет [`AttributeError`](https://python-all.ru/3.4/library/exceptions.html#AttributeError) или [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), а [`throw()`](https://python-all.ru/3.4/reference/expressions.html#generator.throw) просто вызовет переданное исключение немедленно.175176Когда нижележащий итератор завершается, атрибут `value` возникшего экземпляра [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration) становится значением выражения yield. Он может быть установлен явно при возбуждении [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration) или автоматически, если под-итератор является генератором (путём возврата значения из под-генератора).177178> Изменено в версии 3.3: Добавлено `yield from <expr>` для делегирования потока управления под-итератору.179180Круглые скобки могут быть опущены, когда выражение yield является единственным выражением в правой части оператора присваивания.181182> **См. также**183>184> **[**PEP 0255**](https://python-all.ru/3.4/reference/expressions.html) – Простые генераторы**185>186> Предложение о добавлении генераторов и оператора187>188> [`yield`](https://python-all.ru/3.4/reference/simple_stmts.html#yield)189>190> в Python.191>192> **[**PEP 0342**](https://python-all.ru/3.4/reference/expressions.html) – Корутины через расширенные генераторы**193>194> Предложение по улучшению API и синтаксиса генераторов, позволяющее использовать их как простые корутины.195>196> **[**PEP 0380**](https://python-all.ru/3.4/reference/expressions.html) – Синтаксис делегирования подгенератору**197>198> Предложение о введении синтаксиса199>200> `yield_from`201>202> , упрощающего делегирование подгенераторам.203204#### 6.2.9.1. Методы итератора генератора205206В этом подразделе описаны методы итератора генератора. Они могут использоваться для управления выполнением генераторной функции.207208Обратите внимание, что вызов любого из приведённых ниже методов генератора, когда генератор уже выполняется, вызывает исключение [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError).209210#### `generator.__next__()`211212Запускает выполнение генераторной функции или возобновляет его с последнего выполненного выражения yield. Когда генераторная функция возобновляется методом [`__next__()`](https://python-all.ru/3.4/reference/expressions.html#generator.__next__), текущее выражение yield всегда вычисляется в [`None`](https://python-all.ru/3.4/library/constants.html#None). Затем выполнение продолжается до следующего выражения yield, где генератор снова приостанавливается, и значение [`expression_list`](https://python-all.ru/3.4/reference/expressions.html#grammar-token-expression_list) возвращается вызывающему [`__next__()`](https://python-all.ru/3.4/reference/expressions.html#generator.__next__). Если генератор завершается, не вернув другого значения, возбуждается исключение [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration).213214Обычно этот метод вызывается неявно, например, циклом [`for`](https://python-all.ru/3.4/reference/compound_stmts.html#for) или встроенной функцией [`next()`](https://python-all.ru/3.4/library/functions.html#next).215216#### `generator.send(value)`217218Возобновляет выполнение и «отправляет» значение в генераторную функцию. Аргумент *value* становится результатом текущего выражения yield. Метод [`send()`](https://python-all.ru/3.4/reference/expressions.html#generator.send) возвращает следующее значение, возвращённое генератором, или возбуждает [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration), если генератор завершается, не вернув другого значения. При вызове [`send()`](https://python-all.ru/3.4/reference/expressions.html#generator.send) для запуска генератора он должен вызываться с аргументом [`None`](https://python-all.ru/3.4/library/constants.html#None), так как нет выражения yield, которое могло бы принять значение.219220#### `generator.throw(type[, value[, traceback]])`221222Возбуждает исключение типа `type` в точке, где генератор был приостановлен, и возвращает следующее значение, возвращённое генераторной функцией. Если генератор завершается, не вернув другого значения, возбуждается исключение [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration). Если генераторная функция не перехватывает переданное исключение или возбуждает другое исключение, то это исключение распространяется на вызывающего.223224#### `generator.close()`225226Возбуждает [`GeneratorExit`](https://python-all.ru/3.4/library/exceptions.html#GeneratorExit) в точке, где генераторная функция была приостановлена. Если после этого генераторная функция возбуждает [`StopIteration`](https://python-all.ru/3.4/library/exceptions.html#StopIteration) (завершаясь нормально или из-за того, что уже закрыта) или [`GeneratorExit`](https://python-all.ru/3.4/library/exceptions.html#GeneratorExit) (не перехватывая исключение), то close возвращается к вызывающему. Если генератор возвращает значение, возбуждается [`RuntimeError`](https://python-all.ru/3.4/library/exceptions.html#RuntimeError). Если генератор возбуждает любое другое исключение, оно распространяется на вызывающего. [`close()`](https://python-all.ru/3.4/reference/expressions.html#generator.close) ничего не делает, если генератор уже завершился из-за исключения или нормального завершения.227228#### 6.2.9.2. Примеры229230Вот простой пример, демонстрирующий поведение генераторов и генераторных функций:231232```python233>>> def echo(value=None):234... print("Execution starts when 'next()' is called for the first time.")235... try:236... while True:237... try:238... value = (yield value)239... except Exception as e:240... value = e241... finally:242... print("Don't forget to clean up when 'close()' is called.")243...244>>> generator = echo(1)245>>> print(next(generator))246Execution starts when 'next()' is called for the first time.2471248>>> print(next(generator))249None250>>> print(generator.send(2))2512252>>> generator.throw(TypeError, "spam")253TypeError('spam',)254>>> generator.close()255Don't forget to clean up when 'close()' is called.256```257258Примеры использования `yield from` см. в [*PEP 380: Syntax for Delegating to a Subgenerator*](https://python-all.ru/3.4/whatsnew/3.3.html#pep-380) в разделе «What’s New in Python.»259260## 6.3. Первичные выражения261262Первичные выражения представляют операции с самой высокой связностью в языке. Их синтаксис:263264```265266primary ::= atom | attributeref | subscription | slicing | call267```268269### 6.3.1. Ссылки на атрибуты270271Ссылка на атрибут – это первичное выражение, за которым следуют точка и имя:272273```274275attributeref ::= primary "." identifier276```277278Первичное выражение должно вычисляться в объект типа, поддерживающего ссылки на атрибуты (большинство объектов это делают). Затем у этого объекта запрашивается атрибут, имя которого является идентификатором. Это получение можно настроить, переопределив метод [`__getattr__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getattr__). Если такой атрибут недоступен, возбуждается исключение [`AttributeError`](https://python-all.ru/3.4/library/exceptions.html#AttributeError). В противном случае тип и значение полученного объекта определяются самим объектом. При многократном вычислении одной и той же ссылки на атрибут могут получаться разные объекты.279280### 6.3.2. Подписки281282Индексация выбирает элемент последовательности (строки, кортежа или списка) или отображения (словаря):283284```285286subscription ::= primary "[" expression_list "]"287```288289Первичное выражение должно вычисляться в объект, поддерживающий индексацию (например, списки или словари). Пользовательские объекты могут поддерживать индексацию, определив метод [`__getitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getitem__).290291Для встроенных объектов существует два типа объектов, поддерживающих индексацию:292293Если первичное выражение является отображением, список выражений должен вычисляться в объект, значение которого является одним из ключей отображения, и индексация выбирает значение в отображении, соответствующее этому ключу. (Список выражений представляет собой кортеж, за исключением случая, когда он содержит ровно один элемент.)294295Если первичное выражение является последовательностью, то выражение (список) должно вычисляться в целое число или срез (как обсуждается в следующем разделе).296297Формальный синтаксис не делает специальных оговорок для отрицательных индексов в последовательностях; однако все встроенные последовательности предоставляют метод [`__getitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getitem__), который интерпретирует отрицательные индексы, добавляя длину последовательности к индексу (так что `x[-1]` выбирает последний элемент `x`). Полученное значение должно быть неотрицательным целым числом, меньшим количества элементов в последовательности, и индексация выбирает элемент с таким индексом (начиная с нуля). Поскольку поддержка отрицательных индексов и срезов реализуется в методе [`__getitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getitem__) объекта, подклассы, переопределяющие этот метод, должны будут явно добавить эту поддержку.298299Элементами строки являются символы. Символ не является отдельным типом данных, а представляет собой строку ровно из одного символа.300301### 6.3.3. Срезы302303Срез выбирает диапазон элементов в объекте последовательности (например, строке, кортеже или списке). Срезы могут использоваться как выражения или как цели в операторах присваивания или [`del`](https://python-all.ru/3.4/reference/simple_stmts.html#del). Синтаксис среза:304305```306307slicing ::= primary "[" slice_list "]"308slice_list ::= slice_item ("," slice_item)* [","]309slice_item ::= expression | proper_slice310proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" [stride] ]311lower_bound ::= expression312upper_bound ::= expression313stride ::= expression314```315316В формальном синтаксисе здесь есть неоднозначность: всё, что выглядит как список выражений, также выглядит как список срезов, поэтому любую индексацию можно интерпретировать как срез. Чтобы не усложнять синтаксис, эта неоднозначность разрешается тем, что в данном случае интерпретация как индексация имеет приоритет над интерпретацией как срез (это верно, если список срезов не содержит полноценного среза).317318Семантика среза следующая. Первичное выражение индексируется (с использованием того же метода [`__getitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getitem__), что и при обычной индексации) ключом, который строится из списка срезов следующим образом. Если список срезов содержит хотя бы одну запятую, ключом является кортеж, содержащий преобразование элементов среза; в противном случае ключом является преобразование единственного элемента среза. Преобразование элемента среза, являющегося выражением, есть само это выражение. Преобразование полного среза – это объект среза (см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.4/reference/datamodel.html#types)), атрибуты `start`, `stop` и `step` которого равны значениям выражений, задающих нижнюю границу, верхнюю границу и шаг соответственно, с подстановкой `None` для отсутствующих выражений.319320### 6.3.4. Вызовы321322Вызов – это обращение к вызываемому объекту (например, [*функции*](https://python-all.ru/3.4/glossary.html#term-function)) с возможно пустой последовательностью [*аргументов*](https://python-all.ru/3.4/glossary.html#term-argument):323324```325326call ::= primary "(" [argument_list [","] | comprehension] ")"327argument_list ::= positional_arguments ["," keyword_arguments]328 ["," "*" expression] ["," keyword_arguments]329 ["," "**" expression]330 | keyword_arguments ["," "*" expression]331 ["," keyword_arguments] ["," "**" expression]332 | "*" expression ["," keyword_arguments] ["," "**" expression]333 | "**" expression334positional_arguments ::= expression ("," expression)*335keyword_arguments ::= keyword_item ("," keyword_item)*336keyword_item ::= identifier "=" expression337```338339После позиционных и именованных аргументов может стоять необязательная завершающая запятая, но на семантику это не влияет.340341Первичное выражение должно быть вызываемым объектом (вызываемыми являются определённые пользователем функции, встроенные функции, методы встроенных объектов, объекты классов, методы экземпляров классов и все объекты, имеющие метод [`__call__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__call__)). Все выражения аргументов вычисляются до попытки вызова. За синтаксисом списков формальных [*параметр*](https://python-all.ru/3.4/glossary.html#term-parameter) обращайтесь к разделу [*Function definitions*](https://python-all.ru/3.4/reference/compound_stmts.html#function).342343При наличии именованных аргументов они сначала преобразуются в позиционные следующим образом. Сначала создаётся список незаполненных слотов для формальных параметров. Если есть N позиционных аргументов, они помещаются в первые N слотов. Затем для каждого именованного аргумента по его идентификатору определяется соответствующий слот (если идентификатор совпадает с именем первого формального параметра, используется первый слот и т.д.). Если слот уже заполнен, вызывается исключение [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). В противном случае значение аргумента помещается в слот, заполняя его (даже если выражение равно `None`, оно всё равно заполняет слот). Когда все аргументы обработаны, оставшиеся незаполненными слоты заполняются соответствующими значениями по умолчанию из определения функции. (Значения по умолчанию вычисляются один раз при определении функции; следовательно, изменяемый объект, такой как список или словарь, используемый в качестве значения по умолчанию, будет общим для всех вызовов, не указывающих значение аргумента для соответствующего слота; этого обычно следует избегать.) Если остаются незаполненные слоты, для которых не указано значение по умолчанию, вызывается исключение [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). В противном случае список заполненных слотов используется как список аргументов для вызова.344345**Особенность реализации CPython:** Реализация может предоставлять встроенные функции, чьи позиционные параметры не имеют имён, даже если они «именованы» в документации, и поэтому их нельзя передать по ключу. В CPython это касается функций, реализованных на C, которые используют [`PyArg_ParseTuple()`](https://python-all.ru/3.4/c-api/arg.html#c.PyArg_ParseTuple) для разбора своих аргументов.346347Если позиционных аргументов больше, чем слотов формальных параметров, вызывается исключение [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), если только не присутствует формальный параметр с синтаксисом `*identifier`; в этом случае этот формальный параметр получает кортеж, содержащий лишние позиционные аргументы (или пустой кортеж, если лишних позиционных аргументов нет).348349Если какой-либо именованный аргумент не соответствует имени формального параметра, вызывается исключение [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), если только не присутствует формальный параметр с синтаксисом `**identifier`; в этом случае этот формальный параметр получает словарь, содержащий лишние именованные аргументы (с ключами в качестве ключей и значениями аргументов в качестве соответствующих значений), или (новый) пустой словарь, если лишних именованных аргументов нет.350351Если в вызове функции присутствует синтаксис `*expression`, то `expression` должно быть итерируемым объектом. Элементы этого итерируемого объекта обрабатываются так, как если бы они были дополнительными позиционными аргументами; если имеются позиционные аргументы *x1*, ..., *xN*, и `expression` вычисляется в последовательность *y1*, ..., *yM*, то это эквивалентно вызову с M+N позиционными аргументами *x1*, ..., *xN*, *y1*, ..., *yM*.352353Следствием этого является то, что хотя синтаксис `*expression` может встречаться *после* некоторых именованных аргументов, он обрабатывается *до* именованных аргументов (и аргумента `**expression`, если таковой имеется – см. ниже). Итак:354355```python356>>> def f(a, b):357... print(a, b)358...359>>> f(b=1, *(2,))3602 1361>>> f(a=1, *(2,))362Traceback (most recent call last):363 File "<stdin>", line 1, in ?364TypeError: f() got multiple values for keyword argument 'a'365>>> f(1, *(2,))3661 2367```368369Необычно использовать одновременно именованные аргументы и синтаксис `*expression` в одном вызове, поэтому на практике такая путаница не возникает.370371Если в вызове функции присутствует синтаксис `**expression`, то `expression` должно быть отображением, содержимое которого обрабатывается как дополнительные именованные аргументы. Если имя аргумента встречается как в `expression`, так и в явном именованном аргументе, вызывается исключение [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError).372373Формальные параметры с синтаксисом `*identifier` или `**identifier` не могут использоваться как слоты позиционных аргументов или как имена именованных аргументов.374375Вызов всегда возвращает какое-либо значение, возможно `None`, если только не возникает исключение. Способ вычисления этого значения зависит от типа вызываемого объекта.376377Если это–378379**пользовательская функция:**380381Выполняется блок кода функции, которому передаётся список аргументов. Первое, что делает блок кода – связывает формальные параметры с аргументами; это описано в разделе [*Function definitions*](https://python-all.ru/3.4/reference/compound_stmts.html#function). Когда блок кода выполняет инструкцию [`return`](https://python-all.ru/3.4/reference/simple_stmts.html#return), она задаёт возвращаемое значение вызова функции.382383**встроенная функция или метод:**384385Результат зависит от интерпретатора; описания встроенных функций и методов см. в [*Встроенные функции*](https://python-all.ru/3.4/library/functions.html#built-in-funcs).386387**объект класса:**388389Возвращается новый экземпляр этого класса.390391**метод экземпляра класса:**392393Вызывается соответствующая пользовательская функция, со списком аргументов, который на один длиннее списка аргументов вызова: экземпляр становится первым аргументом.394395**экземпляр класса:**396397Класс должен определять метод [`__call__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__call__); результат будет таким же, как если бы этот метод был вызван.398399## 6.4. Оператор возведения в степень400401Оператор возведения в степень имеет более высокий приоритет, чем унарные операторы слева, и более низкий приоритет, чем унарные операторы справа. Синтаксис:402403```404405power ::= primary ["**" u_expr]406```407408Таким образом, в последовательности операторов возведения в степень и унарных операторов без скобок операторы вычисляются справа налево (это не накладывает ограничений на порядок вычисления операндов): `-1**2` даёт `-1`.409410Оператор возведения в степень имеет ту же семантику, что и встроенная функция [`pow()`](https://python-all.ru/3.4/library/functions.html#pow), вызываемая с двумя аргументами: он возвращает левый аргумент, возведённый в степень правого. Числовые аргументы сначала преобразуются к общему типу, и результат имеет этот тип.411412Для операндов типа int результат имеет тот же тип, что и операнды, если только второй аргумент не отрицателен; в этом случае все аргументы преобразуются в float и возвращается результат типа float. Например, `10**2` возвращает `100`, но `10**-2` возвращает `0.01`.413414Возведение `0.0` в отрицательную степень приводит к [`ZeroDivisionError`](https://python-all.ru/3.4/library/exceptions.html#ZeroDivisionError). Возведение отрицательного числа в дробную степень даёт комплексное число [`complex`](https://python-all.ru/3.4/library/functions.html#complex). (В более ранних версиях это вызывало [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError).)415416## 6.5. Унарные арифметические и побитовые операции417418Все унарные арифметические и побитовые операции имеют одинаковый приоритет:419420```421422u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr423```424425Унарный оператор `-` (минус) возвращает отрицание своего числового аргумента.426427Унарный оператор `+` (плюс) возвращает свой числовой аргумент без изменений.428429Унарный оператор `~` (инверсия) возвращает побитовую инверсию своего целочисленного аргумента. Побитовая инверсия `x` определяется как `-(x+1)`. Он применим только к целым числам.430431Во всех трёх случаях, если аргумент не имеет правильного типа, вызывается исключение [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError).432433## 6.6. Бинарные арифметические операции434435Бинарные арифметические операции имеют общепринятые уровни приоритета. Обратите внимание, что некоторые из этих операций также применимы к некоторым нечисловым типам. За исключением оператора возведения в степень, существует только два уровня: один для мультипликативных операторов и один для аддитивных операторов:436437```438439m_expr ::= u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr440 | m_expr "%" u_expr441a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr442```443444Оператор `*` (умножения) возвращает произведение своих аргументов. Аргументы должны быть либо оба числами, либо один аргумент – целым числом, а другой – последовательностью. В первом случае числа преобразуются к общему типу и затем перемножаются. Во втором случае выполняется повторение последовательности; отрицательный коэффициент повторения даёт пустую последовательность.445446Операторы `/` (деление) и `//` (целочисленное деление) возвращают частное своих аргументов. Числовые аргументы сначала преобразуются к общему типу. Деление целых чисел даёт число с плавающей запятой (float), а целочисленное деление целых чисел даёт целое число; результат соответствует математическому делению с последующим применением функции «floor». Деление на ноль вызывает исключение [`ZeroDivisionError`](https://python-all.ru/3.4/library/exceptions.html#ZeroDivisionError).447448Оператор `%` (остаток от деления, modulo) возвращает остаток от деления первого аргумента на второй. Числовые аргументы сначала преобразуются к общему типу. Нулевой правый аргумент вызывает исключение [`ZeroDivisionError`](https://python-all.ru/3.4/library/exceptions.html#ZeroDivisionError). Аргументы могут быть числами с плавающей запятой, например, `3.14%0.7` равно `0.34` (поскольку `3.14` равно `4*0.7 + 0.34`.) Оператор остатка от деления всегда возвращает результат с тем же знаком, что и его второй операнд (или ноль); абсолютное значение результата строго меньше абсолютного значения второго операнда [\[1\]](https://python-all.ru/3.4/reference/expressions.html#id16).449450Целочисленное деление и остаток от деления связаны следующим тождеством: `x == (x//y)*y + (x%y)`. Целочисленное деление и остаток также связаны со встроенной функцией [`divmod()`](https://python-all.ru/3.4/library/functions.html#divmod): `divmod(x, y) == (x//y, x%y)`. [\[2\]](https://python-all.ru/3.4/reference/expressions.html#id17).451452Помимо выполнения операции взятия остатка над числами, оператор `%` также перегружается строковыми объектами для выполнения форматирования строк в старом стиле (также известного как интерполяция). Синтаксис форматирования строк описан в справочнике по библиотеке Python, раздел [*Форматирование строк в стиле printf*](https://python-all.ru/3.4/library/stdtypes.html#old-string-formatting).453454Операторы целочисленного деления, остатка от деления и функция [`divmod()`](https://python-all.ru/3.4/library/functions.html#divmod) не определены для комплексных чисел. Вместо этого следует преобразовать в число с плавающей запятой с помощью функции [`abs()`](https://python-all.ru/3.4/library/functions.html#abs), если это уместно.455456Оператор `+` (сложения) возвращает сумму своих аргументов. Аргументы должны быть либо оба числами, либо оба последовательностями одного типа. В первом случае числа преобразуются к общему типу и затем складываются. Во втором случае последовательности конкатенируются.457458Оператор `-` (вычитания) возвращает разность своих аргументов. Числовые аргументы сначала преобразуются к общему типу.459460## 6.7. Операции сдвига461462Операции сдвига имеют более низкий приоритет, чем арифметические операции:463464```465466shift_expr ::= a_expr | shift_expr ( "<<" | ">>" ) a_expr467```468469Эти операторы принимают целые числа в качестве аргументов. Они сдвигают первый аргумент влево или вправо на количество бит, заданное вторым аргументом.470471Сдвиг вправо на *n* бит определяется как целочисленное деление на `pow(2,n)`. Сдвиг влево на *n* бит определяется как умножение на `pow(2,n)`.472473> **Примечание**474>475> В текущей реализации правый операнд должен быть не больше [`sys.maxsize`](https://python-all.ru/3.4/library/sys.html#sys.maxsize). Если правый операнд больше [`sys.maxsize`](https://python-all.ru/3.4/library/sys.html#sys.maxsize), вызывается исключение [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError).476477## 6.8. Бинарные побитовые операции478479Каждая из трёх побитовых операций имеет свой уровень приоритета:480481```482483and_expr ::= shift_expr | and_expr "&" shift_expr484xor_expr ::= and_expr | xor_expr "^" and_expr485or_expr ::= xor_expr | or_expr "|" xor_expr486```487488Оператор `&` возвращает побитовое И своих аргументов, которые должны быть целыми числами.489490Оператор `^` возвращает побитовое исключающее ИЛИ (XOR) своих аргументов, которые должны быть целыми числами.491492Оператор `|` возвращает побитовое (включающее) ИЛИ своих аргументов, которые должны быть целыми числами.493494## 6.9. Сравнения495496В отличие от C, все операции сравнения в Python имеют одинаковый приоритет, который ниже приоритета любых арифметических, сдвиговых или побитовых операций. Также в отличие от C, выражения вида `a < b < c` интерпретируются так, как это принято в математике:497498```499500comparison ::= or_expr ( comp_operator or_expr )*501comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="502 | "is" ["not"] | ["not"] "in"503```504505Сравнения возвращают логические значения: `True` или `False`.506507Сравнения могут объединяться в цепочки произвольным образом, например, `x < y <= z` эквивалентно `x < y and y <= z`, за исключением того, что `y` вычисляется только один раз (но в обоих случаях `z` не вычисляется вообще, если `x < y` оказывается ложным).508509Формально, если *a*, *b*, *c*, ..., *y*, *z* – это выражения, а *op1*, *op2*, ..., *opN* – операторы сравнения, то `a op1 b op2 c ... y opN z` эквивалентно `a op1 b and b op2 c and ... y opN z`, за исключением того, что каждое выражение вычисляется не более одного раза.510511Обратите внимание, что `a op1 b op2 c` не подразумевает никакого сравнения между *a* и *c*, так что, например, `x < y > z` совершенно законно (хотя, возможно, и некрасиво).512513### 6.9.1. Сравнения значений514515Операторы `<`, `>`, `==`, `>=`, `<=` и `!=` сравнивают значения двух объектов. Объекты не обязательно должны иметь одинаковый тип.516517В главе [*Объекты, значения и типы*](https://python-all.ru/3.4/reference/datamodel.html#objects) говорится, что объекты имеют значение (в дополнение к типу и идентичности). Значение объекта – довольно абстрактное понятие в Python: например, не существует канонического метода доступа к значению объекта. Также не требуется, чтобы значение объекта было сформировано определённым образом, например, из всех его атрибутов данных. Операторы сравнения реализуют определённое представление о том, что является значением объекта. Можно считать, что они косвенно определяют значение объекта через свою реализацию сравнения.518519Поскольку все типы являются (прямыми или косвенными) подтипами [`object`](https://python-all.ru/3.4/library/functions.html#object), они наследуют поведение сравнения по умолчанию от [`object`](https://python-all.ru/3.4/library/functions.html#object). Типы могут настраивать своё поведение сравнения, реализуя *методы расширенного сравнения*, такие как [`__lt__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__lt__), описанные в разделе [*Базовая настройка*](https://python-all.ru/3.4/reference/datamodel.html#customization).520521Поведение по умолчанию для сравнения на равенство (`==` и `!=`) основано на идентичности объектов. Следовательно, сравнение экземпляров с одинаковой идентичностью даёт равенство, а сравнение экземпляров с разной идентичностью даёт неравенство. Причина такого поведения по умолчанию – желание, чтобы все объекты были рефлексивны (т.е. `x is y` влечёт `x == y`).522523Поведение по умолчанию для сравнения порядка (`<`, `>`, `<=` и `>=`) не предусмотрено; попытка вызывает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError). Причина такого поведения по умолчанию – отсутствие аналогичного инварианта, как для равенства.524525Поведение сравнения на равенство по умолчанию, при котором экземпляры с разной идентичностью всегда неравны, может противоречить тому, что нужно типам, имеющим разумное определение значения объекта и равенства на основе значения. Таким типам потребуется настраивать своё поведение сравнения, и, в самом деле, ряд встроенных типов уже это сделал.526527Следующий список описывает поведение сравнения наиболее важных встроенных типов.528529- Числа встроенных числовых типов ([*Числовые типы – int, float, complex*](https://python-all.ru/3.4/library/stdtypes.html#typesnumeric)) и типов стандартной библиотеки [`fractions.Fraction`](https://python-all.ru/3.4/library/fractions.html#fractions.Fraction) и [`decimal.Decimal`](https://python-all.ru/3.4/library/decimal.html#decimal.Decimal) можно сравнивать как внутри своих типов, так и между ними, с тем ограничением, что комплексные числа не поддерживают сравнение порядка. В пределах задействованных типов они сравниваются математически (алгоритмически) корректно без потери точности.530531 Значения «не число» `float('NaN')` и `Decimal('NaN')` являются особенными. Они идентичны самим себе (`x is x` – истина), но не равны самим себе (`x == x` – ложь). Кроме того, сравнение любого числа со значением «не число» вернёт `False`. Например, и `3 < float('NaN')`, и `float('NaN') < 3` вернут `False`.532- Двоичные последовательности (экземпляры [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) или [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray)) можно сравнивать как внутри своих типов, так и между ними. Они сравниваются лексикографически, используя числовые значения своих элементов.533- Строки (экземпляры [`str`](https://python-all.ru/3.4/library/stdtypes.html#str)) сравниваются лексикографически, используя числовые кодовые точки Unicode (результат встроенной функции [`ord()`](https://python-all.ru/3.4/library/functions.html#ord)) символов. [\[3\]](https://python-all.ru/3.4/reference/expressions.html#id18)534535 Строки и двоичные последовательности нельзя сравнивать напрямую.536- Последовательности (экземпляры [`tuple`](https://python-all.ru/3.4/library/stdtypes.html#tuple), [`list`](https://python-all.ru/3.4/library/stdtypes.html#list) или [`range`](https://python-all.ru/3.4/library/stdtypes.html#range)) можно сравнивать только внутри каждого из своих типов, с тем ограничением, что диапазоны не поддерживают сравнение порядка. Сравнение на равенство между этими типами даёт неравенство, а сравнение порядка между этими типами вызывает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError).537538 Последовательности сравниваются лексикографически путём сравнения соответствующих элементов, при этом обеспечивается рефлексивность элементов.539540 При обеспечении рефлексивности элементов сравнение коллекций предполагает, что для элемента коллекции `x` выражение `x == x` всегда истинно. Исходя из этого предположения, сначала сравнивается идентичность элементов, а сравнение элементов выполняется только для различных элементов. Такой подход даёт тот же результат, что и строгое сравнение элементов, если сравниваемые элементы рефлексивны. Для нерефлексивных элементов результат отличается от строгого сравнения и может быть удивительным: например, нерефлексивные значения «не число» приводят к следующему поведению при использовании в списке:541542 ```python543 >>> nan = float('NaN')544 >>> nan is nan545 True546 >>> nan == nan547 False <-- the defined non-reflexive behavior of NaN548 >>> [nan] == [nan]549 True <-- list enforces reflexivity and tests identity first550 ```551552 Лексикографическое сравнение между встроенными коллекциями работает следующим образом:553554 - Чтобы две коллекции были равны при сравнении, они должны быть одного типа, иметь одинаковую длину, и каждая пара соответствующих элементов должна быть равной (например, `[1,2] == (1,2)` – ложь, так как типы разные).555 - Коллекции, поддерживающие сравнение порядка, упорядочиваются так же, как их первые неравные элементы (например, `[1,2,x] <= [1,2,y]` имеет то же значение, что и `x <= y`). Если соответствующий элемент отсутствует, сначала упорядочивается более короткая коллекция (например, `[1,2] < [1,2,3]` истинно).556- Отображения (экземпляры [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict)) считаются равными тогда и только тогда, когда они имеют одинаковые пары *(ключ, значение)*. Сравнение ключей и элементов на равенство обеспечивает рефлексивность.557558 Сравнения порядка (`<`, `>`, `<=` и `>=`) вызывают [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError).559- Множества (экземпляры [`set`](https://python-all.ru/3.4/library/stdtypes.html#set) или [`frozenset`](https://python-all.ru/3.4/library/stdtypes.html#frozenset)) можно сравнивать как внутри своих типов, так и между ними.560561 Они определяют операторы сравнения порядка как проверки на подмножество и надмножество. Эти отношения не задают полного порядка (например, два множества `{1,2}` и `{2,3}` не равны, не являются подмножествами друг друга и не являются надмножествами друг друга). Соответственно, множества не подходят в качестве аргументов для функций, зависящих от полного порядка (например, [`min()`](https://python-all.ru/3.4/library/functions.html#min), [`max()`](https://python-all.ru/3.4/library/functions.html#max) и [`sorted()`](https://python-all.ru/3.4/library/functions.html#sorted) дают неопределённые результаты, если на вход подаётся список множеств).562563 Сравнение множеств требует рефлексивности их элементов.564- У большинства других встроенных типов нет реализованных методов сравнения, поэтому они наследуют поведение сравнения по умолчанию.565566Пользовательские классы, которые настраивают своё поведение сравнения, должны по возможности следовать некоторым правилам согласованности:567568- Сравнение на равенство должно быть рефлексивным. Другими словами, идентичные объекты должны быть равны:569570 > `x is y` влечёт `x == y`571- Сравнение должно быть симметричным. Другими словами, следующие выражения должны давать одинаковый результат:572573 > `x == y` и `y == x`574 >575 > `x != y` и `y != x`576 >577 > `x < y` и `y > x`578 >579 > `x <= y` и `y >= x`580- Сравнение должно быть транзитивным. Следующие (неисчерпывающие) примеры это иллюстрируют:581582 > `x > y и y > z` влечёт `x > z`583 >584 > `x < y и y <= z` влечёт `x < z`585- Обратное сравнение должно давать логическое отрицание. Другими словами, следующие выражения должны давать одинаковый результат:586587 > `x == y` и `не x != y`588 >589 > `x < y` и `не x >= y` (для полного порядка)590 >591 > `x > y` и `не x <= y` (для полного порядка)592593 Последние два выражения применимы к полностью упорядоченным коллекциям (например, к последовательностям, но не к множествам или отображениям). См. также декоратор [`total_ordering()`](https://python-all.ru/3.4/library/functools.html#functools.total_ordering).594595Python не требует соблюдения этих правил согласованности. Фактически, значения «не число» (NaN) являются примером их нарушения.596597### 6.9.2. Операции проверки членства598599Операторы [`in`](https://python-all.ru/3.4/reference/expressions.html#in) и [`not in`](https://python-all.ru/3.4/reference/expressions.html#not-in) проверяют членство. `x in s` вычисляется как истина, если *x* является членом *s*, и ложь в противном случае. `x not in s` возвращает отрицание `x in s`. Все встроенные последовательности и типы множеств поддерживают это, а также словари, для которых [`in`](https://python-all.ru/3.4/reference/expressions.html#in) проверяет, содержит ли словарь заданный ключ. Для контейнерных типов, таких как list, tuple, set, frozenset, dict или collections.deque, выражение `x in y` эквивалентно `any(x is e or x == e for e in y)`.600601Для строк и байтовых типов `x in y` истинно тогда и только тогда, когда *x* является подстрокой *y*. Эквивалентная проверка: `y.find(x) != -1`. Пустые строки всегда считаются подстрокой любой другой строки, поэтому `"" in "abc"` вернёт `True`.602603Для пользовательских классов, которые определяют метод [`__contains__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__contains__), `x in y` истинно тогда и только тогда, когда `y.__contains__(x)` истинно.604605Для пользовательских классов, которые не определяют [`__contains__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__contains__), но определяют [`__iter__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__iter__), `x in y` истинно, если при итерации по `y` производится некоторое значение `z`, для которого `x == z`. Если во время итерации возникает исключение, то считается, что его возбудил [`in`](https://python-all.ru/3.4/reference/expressions.html#in).606607Наконец, применяется протокол итерации старого образца: если класс определяет [`__getitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getitem__), то `x in y` истинно тогда и только тогда, когда существует неотрицательный целочисленный индекс *i*, такой что `x == y[i]`, и все меньшие целочисленные индексы не возбуждают исключение [`IndexError`](https://python-all.ru/3.4/library/exceptions.html#IndexError). (Если возбуждается любое другое исключение, то считается, что его возбудил [`in`](https://python-all.ru/3.4/reference/expressions.html#in)).608609Оператор [`not in`](https://python-all.ru/3.4/reference/expressions.html#not-in) определён так, что его истинностное значение противоположно истинностному значению оператора [`in`](https://python-all.ru/3.4/reference/expressions.html#in).610611### 6.9.3. Сравнения идентичности612613Операторы [`is`](https://python-all.ru/3.4/reference/expressions.html#is) и [`is not`](https://python-all.ru/3.4/reference/expressions.html#is-not) проверяют идентичность объектов: `x is y` истинно тогда и только тогда, когда *x* и *y* являются одним и тем же объектом. `x is not y` даёт противоположное истинностное значение. [\[4\]](https://python-all.ru/3.4/reference/expressions.html#id19)614615## 6.10. Логические операции616617```618619or_test ::= and_test | or_test "or" and_test620and_test ::= not_test | and_test "and" not_test621not_test ::= comparison | "not" not_test622```623624В контексте логических операций, а также когда выражения используются операторами управления потоком, следующие значения интерпретируются как ложные: `False`, `None`, числовые нули всех типов, а также пустые строки и контейнеры (включая строки, кортежи, списки, словари, множества и frozenset). Все остальные значения интерпретируются как истинные. Пользовательские объекты могут настраивать своё истинностное значение, предоставляя метод [`__bool__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__bool__).625626Оператор [`not`](https://python-all.ru/3.4/reference/expressions.html#not) возвращает `True`, если его аргумент ложен, и `False` в противном случае.627628Выражение `x and y` сначала вычисляет *x*; если *x* ложно, возвращается его значение; в противном случае вычисляется *y* и возвращается полученное значение.629630Выражение `x or y` сначала вычисляет *x*; если *x* истинно, возвращается его значение; в противном случае вычисляется *y* и возвращается полученное значение.631632(Заметьте, что ни [`and`](https://python-all.ru/3.4/reference/expressions.html#and), ни [`or`](https://python-all.ru/3.4/reference/expressions.html#or) не ограничивают возвращаемое значение и тип только `False` и `True`, а возвращают последний вычисленный аргумент. Это иногда бывает полезно: например, если `s` – строка, которую нужно заменить значением по умолчанию, если она пуста, то выражение `s or 'foo'` даёт нужное значение. Поскольку [`not`](https://python-all.ru/3.4/reference/expressions.html#not) вынужден создавать новое значение, он возвращает логическое значение независимо от типа своего аргумента (например, `not 'foo'` даёт `False`, а не `''`.)633634## 6.11. Условные выражения635636```637638conditional_expression ::= or_test ["if" or_test "else" expression]639expression ::= conditional_expression | lambda_expr640expression_nocond ::= or_test | lambda_expr_nocond641```642643Условные выражения (иногда называемые «тернарным оператором») имеют самый низкий приоритет среди всех операций Python.644645Выражение `x if C else y` сначала вычисляет условие *C*, а не *x*. Если *C* истинно, вычисляется *x* и возвращается его значение; в противном случае вычисляется *y* и возвращается его значение.646647См. [**PEP 308**](https://python-all.ru/3.4/reference/expressions.html) для получения дополнительных сведений об условных выражениях.648649## 6.12. Лямбда-выражения650651```652653lambda_expr ::= "lambda" [parameter_list]: expression654lambda_expr_nocond ::= "lambda" [parameter_list]: expression_nocond655```656657Лямбда-выражения (иногда называемые лямбда-формами) используются для создания анонимных функций. Выражение `lambda arguments: expression` даёт объект функции. Этот безымянный объект ведёт себя как объект функции, определённый с помощью658659```python660def <lambda>(arguments):661 return expression662```663664См. раздел [*Определения функций*](https://python-all.ru/3.4/reference/compound_stmts.html#function) о синтаксисе списков параметров. Обратите внимание, что функции, созданные с помощью лямбда-выражений, не могут содержать инструкции или аннотации.665666## 6.13. Списки выражений667668```669670expression_list ::= expression ( "," expression )* [","]671```672673Список выражений, содержащий хотя бы одну запятую, образует кортеж. Длина кортежа равна количеству выражений в списке. Выражения вычисляются слева направо.674675Завершающая запятая требуется только для создания кортежа из одного элемента (т.н. *синглетон*); во всех остальных случаях она необязательна. Одиночное выражение без завершающей запятой не создаёт кортеж, а возвращает значение этого выражения. (Чтобы создать пустой кортеж, используйте пустую пару круглых скобок: `()`.)676677## 6.14. Порядок вычисления678679Python вычисляет выражения слева направо. Обратите внимание, что при вычислении присваивания сначала вычисляется правая часть, а затем левая.680681В следующих строках выражения будут вычисляться в арифметическом порядке их суффиксов:682683```python684expr1, expr2, expr3, expr4685(expr1, expr2, expr3, expr4)686{expr1: expr2, expr3: expr4}687expr1 + expr2 * (expr3 - expr4)688expr1(expr2, expr3, *expr4, **expr5)689expr3, expr4 = expr1, expr2690```691692## 6.15. Приоритет операторов693694В следующей таблице приведён приоритет операторов в Python от самого низкого (наименее связывающего) до самого высокого (наиболее связывающего). Операторы в одной ячейке имеют одинаковый приоритет. Если синтаксис не указан явно, операторы являются бинарными. Операторы в одной ячейке группируются слева направо (за исключением возведения в степень, которое группируется справа налево).695696Сравнения, проверки принадлежности и проверки тождественности имеют одинаковый приоритет и связываются слева направо, как описано в разделе [*Сравнения*](https://python-all.ru/3.4/reference/expressions.html#comparisons).697698| Оператор | Описание |699| --- | --- |700| [`lambda`](https://python-all.ru/3.4/reference/expressions.html#lambda) | Лямбда-выражение |701| [`if`](https://python-all.ru/3.4/reference/compound_stmts.html#if) – [`else`](https://python-all.ru/3.4/reference/compound_stmts.html#else) | Условное выражение |702| [`or`](https://python-all.ru/3.4/reference/expressions.html#or) | Логическое ИЛИ |703| [`and`](https://python-all.ru/3.4/reference/expressions.html#and) | Логическое И |704| [`not`](https://python-all.ru/3.4/reference/expressions.html#not) `x` | Логическое НЕ |705| [`in`](https://python-all.ru/3.4/reference/expressions.html#in), [`not in`](https://python-all.ru/3.4/reference/expressions.html#not-in), [`is`](https://python-all.ru/3.4/reference/expressions.html#is), [`is not`](https://python-all.ru/3.4/reference/expressions.html#is-not), `<`, `<=`, `>`, `>=`, `!=`, `==` | Сравнения, включая проверки принадлежности и тождественности |706| `\|` | Побитовое ИЛИ |707| `^` | Побитовое исключающее ИЛИ |708| `&` | Побитовое И |709| `<<`, `>>` | Сдвиги |710| `+`, `-` | Сложение и вычитание |711| `*`, `/`, `//`, `%` | Умножение, деление, остаток [\[5\]](https://python-all.ru/3.4/reference/expressions.html#id20) |712| `+x`, `-x`, `~x` | Унарный плюс, унарный минус, побитовое НЕ |713| `**` | Возведение в степень [\[6\]](https://python-all.ru/3.4/reference/expressions.html#id21) |714| `x[index]`, `x[index:index]`, `x(arguments...)`, `x.attribute` | Индексация, срез, вызов, ссылка на атрибут |715| `(expressions...)`, `[expressions...]`, `{key: value...}`, `{expressions...}` | Связывание или отображение кортежа, отображение списка, отображение словаря, отображение множества |716717Сноски718719| [\[1\]](https://python-all.ru/3.4/reference/expressions.html#id8) | Хотя математически `abs(x%y) < abs(y)` истинно, для чисел с плавающей запятой это может не выполняться из-за округления. Например, предположим платформу, на которой Python float является числом двойной точности IEEE 754. Чтобы `-1e-100 % 1e100` имел тот же знак, что и `1e100`, вычисленный результат равен `-1e-100 + 1e100`, что численно точно равно `1e100`. Функция [`math.fmod()`](https://python-all.ru/3.4/library/math.html#math.fmod) возвращает результат, знак которого совпадает со знаком первого аргумента, и в данном случае возвращает `-1e-100`. Какой подход более подходит, зависит от приложения. |720| --- | --- |721722| [\[2\]](https://python-all.ru/3.4/reference/expressions.html#id9) | Если x очень близок к точному целому кратному y, возможно, что `x//y` будет на единицу больше, чем `(x-x%y)//y`, из-за округления. В таких случаях Python возвращает второй результат, чтобы сохранить `divmod(x,y)[0] * y + x % y` очень близким к `x`. |723| --- | --- |724725| [\[3\]](https://python-all.ru/3.4/reference/expressions.html#id11) | Стандарт Unicode различает *кодовые точки* (например, U+0041) и *абстрактные символы* (например, «LATIN CAPITAL LETTER A»). Хотя большинство абстрактных символов в Unicode представлены одной кодовой точкой, существует ряд абстрактных символов, которые могут быть представлены последовательностью из нескольких кодовых точек. Например, абстрактный символ «LATIN CAPITAL LETTER C WITH CEDILLA» может быть представлен как один *предварительно составленный символ* в позиции U+00C7 или как последовательность *базового символа* в позиции U+0043 (LATIN CAPITAL LETTER C), за которым следует *комбинируемый символ* в позиции U+0327 (COMBINING CEDILLA). Операторы сравнения строк сравнивают на уровне кодовых точек Unicode. Это может быть неочевидно. Например, `"\u00C7" == "\u0043\u0327"` даёт `False`, хотя обе строки представляют один и тот же абстрактный символ «LATIN CAPITAL LETTER C WITH CEDILLA». Для сравнения строк на уровне абстрактных символов (то есть интуитивно понятным для человека способом) используйте [`unicodedata.normalize()`](https://python-all.ru/3.4/library/unicodedata.html#unicodedata.normalize). |726| --- | --- |727728| [\[4\]](https://python-all.ru/3.4/reference/expressions.html#id12) | Из-за автоматической сборки мусора, списков свободных блоков и динамической природы дескрипторов в некоторых случаях использования оператора [`is`](https://python-all.ru/3.4/reference/expressions.html#is) может наблюдаться необычное поведение, например при сравнении методов экземпляров или констант. Обратитесь к их документации за подробностями. |729| --- | --- |730731| [\[5\]](https://python-all.ru/3.4/reference/expressions.html#id14) | Оператор `%` также используется для форматирования строк; для него действует тот же приоритет. |732| --- | --- |733734| [\[6\]](https://python-all.ru/3.4/reference/expressions.html#id15) | Оператор возведения в степень `**` связывает менее тесно, чем арифметический или побитовый унарный оператор справа от него, то есть `2**-1` равно `0.5`. |735| --- | --- |736