expressions.md
1> **Источник:** https://python-all.ru/3.15/reference/expressions.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 6. Выражения89В этой главе объясняется значение элементов выражений в Python.1011**Примечания по синтаксису:** В этой и следующих главах [грамматическая нотация](https://python-all.ru/3.15/reference/introduction.html#notation) будет использоваться для описания синтаксиса, а не лексического анализа.1213Когда (одна из альтернатив) синтаксического правила имеет вид:1415```1617name: othername18```1920и семантика не указана, то семантика этой формы `name` такая же, как для `othername`.2122## 6.1. Арифметические преобразования2324Когда в описании арифметического оператора ниже используется фраза «числовые аргументы преобразуются к общему вещественному типу», это означает, что реализация оператора для встроенных числовых типов работает так, как описано в разделе [Числовые типы](https://python-all.ru/3.15/library/stdtypes.html#stdtypes-mixed-arithmetic) документации стандартной библиотеки.2526Некоторые дополнительные правила применяются к определённым операторам и нечисловым операндам (например, строка в качестве левого аргумента оператора `%`). Расширения должны определять собственное поведение преобразования.2728## 6.2. Атомы2930Атомы – это самые базовые элементы выражений. Простейшие атомы – это [встроенные константы](https://python-all.ru/3.15/reference/expressions.html#atom-singletons), [имена](https://python-all.ru/3.15/reference/lexical_analysis.html#identifiers) и [литералы](https://python-all.ru/3.15/reference/expressions.html#atom-literals). Более сложные атомы заключаются в парные разделители:3132- `()` (круглые скобки): [группы](https://python-all.ru/3.15/reference/expressions.html#parenthesized), [отображения кортежей](https://python-all.ru/3.15/reference/expressions.html#tuple-display), [атомы yield](https://python-all.ru/3.15/reference/expressions.html#yieldexpr) и [генераторные выражения](https://python-all.ru/3.15/reference/expressions.html#genexpr);33- `[]` (квадратные скобки): [отображения списков](https://python-all.ru/3.15/reference/expressions.html#lists);34- `{}` (фигурные скобки): [словаря](https://python-all.ru/3.15/reference/expressions.html#dict) и [множества](https://python-all.ru/3.15/reference/expressions.html#set) отображения.3536Формально синтаксис атомов выглядит так:3738```3940atom:41 | builtin_constant42 | identifier43 | literal44 | parenthesized_enclosure45 | bracketed_enclosure46 | braced_enclosure47parenthesized_enclosure:48 | group49 | tuple50 | yield_atom51 | generator_expression52bracketed_enclosure:53 | listcomp54 | list55braced_enclosure:56 | dictcomp57 | dict58 | setcomp59 | set60```6162### 6.2.1. Встроенные константы6364Ключевые слова `True`, `False` и `None` обозначают [встроенные константы](https://python-all.ru/3.15/library/constants.html#built-in-consts). Токен `...` обозначает константу [`Ellipsis`](https://python-all.ru/3.15/library/constants.html#Ellipsis).6566Вычисление этих атомов даёт соответствующее значение.6768> **Примечание**69>70> Есть ещё несколько встроенных констант, доступных как глобальные переменные, но только упомянутые здесь являются [ключевыми словами](https://python-all.ru/3.15/reference/lexical_analysis.html#keywords). В частности, эти имена нельзя переопределять или использовать как атрибуты:71>72> ```pycon73> >>> False = 12374> File "<input>", line 175> False = 12376> ^^^^^77> SyntaxError: cannot assign to False78> ```7980Формально синтаксис встроенных констант:8182```8384builtin_constant: 'True' | 'False' | 'None' | '...'85```8687### 6.2.2. Идентификаторы (Имена)8889Идентификатор, выступающий в роли атома, является именем. См. раздел [Имена (идентификаторы и ключевые слова)](https://python-all.ru/3.15/reference/lexical_analysis.html#identifiers) для лексического определения и раздел [Именование и связывание](https://python-all.ru/3.15/reference/executionmodel.html#naming) для документации по именованию и связыванию.9091Когда имя привязано к объекту, вычисление атома возвращает этот объект. Когда имя не привязано, попытка его вычисления вызывает [`NameError`](https://python-all.ru/3.15/library/exceptions.html#NameError) исключение.9293#### 6.2.2.1. Преобразование приватных имён9495Когда идентификатор, текстуально встречающийся в определении класса, начинается с двух или более символов подчёркивания и не заканчивается двумя или более подчёркиваниями, он считается *приватным именем* этого класса.9697> **См. также**98>99> [Спецификации классов](https://python-all.ru/3.15/reference/compound_stmts.html#class).100101Более точно, приватные имена преобразуются в более длинную форму до генерации кода. Если преобразованное имя длиннее 255 символов, может произойти усечение, определяемое реализацией.102103Преобразование не зависит от синтаксического контекста, в котором используется идентификатор, но только следующие приватные идентификаторы преобразуются:104105- Любое имя, используемое как имя переменной, которой присваивается значение или которая читается, или любое имя атрибута, к которому осуществляется доступ.106107 Однако атрибут [`__name__`](https://python-all.ru/3.15/library/stdtypes.html#definition.__name__) вложенных функций, классов и псевдонимов типов не преобразуется.108- Имя импортированных модулей, например, `__spam` в `import __spam`. Если модуль является частью пакета (т.е. его имя содержит точку), то имя *не* преобразуется, например, `__foo` в `import __foo.bar` не преобразуется.109- Имя импортированного члена, например, `__f` в `from spam import __f`.110111Правило преобразования определяется следующим образом:112113- Имя класса с удалёнными начальными подчёркиваниями и одним вставленным начальным подчёркиванием добавляется перед идентификатором, например, идентификатор `__spam`, встречающийся в классе с именем `Foo`, `_Foo` или `__Foo`, преобразуется в `_Foo__spam`.114- Если имя класса состоит только из подчёркиваний, преобразование не выполняется – например, идентификатор `__spam` в классе с именем `_` или `__` остаётся без изменений.115116### 6.2.3. Литералы117118*Литерал* – это текстовое представление значения. Python поддерживает числовые, строковые и байтовые литералы. [Форматированные строки](https://python-all.ru/3.15/reference/lexical_analysis.html#f-strings) и [шаблонные строки](https://python-all.ru/3.15/reference/lexical_analysis.html#t-strings) считаются строковыми литералами.119120Числовые литералы состоят из одного токена [`NUMBER`](https://python-all.ru/3.15/reference/lexical_analysis.html#grammar-token-python-grammar-NUMBER), который задаёт целое число, число с плавающей точкой или комплексное число. Подробнее см. раздел [Числовые литералы](https://python-all.ru/3.15/reference/lexical_analysis.html#numbers) в документации по лексическому анализу.121122Строковые и байтовые литералы могут состоять из нескольких токенов. Подробнее см. раздел [Конкатенация строковых литералов](https://python-all.ru/3.15/reference/expressions.html#string-concatenation).123124Обратите внимание: отрицательные и комплексные числа, такие как `-3` или `3+4.2j`, синтаксически не являются литералами, а представляют собой [унарные](https://python-all.ru/3.15/reference/expressions.html#unary) или [бинарные](https://python-all.ru/3.15/reference/expressions.html#binary) арифметические операции с операторами `-` или `+`.125126Вычисление литерала возвращает объект заданного типа ([`int`](https://python-all.ru/3.15/library/functions.html#int), [`float`](https://python-all.ru/3.15/library/functions.html#float), [`complex`](https://python-all.ru/3.15/library/functions.html#complex), [`str`](https://python-all.ru/3.15/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes) или [`Template`](https://python-all.ru/3.15/library/string.templatelib.html#string.templatelib.Template)) с соответствующим значением. Для литералов с плавающей точкой и комплексных литералов значение может быть приближённым.127128Формальная грамматика литералов:129130```131132literal: strings | NUMBER133```134135#### 6.2.3.1. Литералы и тождественность объектов136137Все литералы соответствуют неизменяемым типам данных, поэтому тождественность объекта менее важна, чем его значение. При многократном вычислении литералов с одинаковым значением (одного и того же или разных вхождений в тексте программы) может получаться как один и тот же объект, так и разные объекты с одним и тем же значением.138139> **Особенность реализации CPython**140>141> Например, в CPython *малые* целые числа с одинаковым значением вычисляются в один и тот же объект:142>143> ```python144> >>> x = 7145> >>> y = 7146> >>> x is y147> True148> ```149>150> Однако большие целые числа вычисляются в разные объекты:151>152> ```python153> >>> x = 123456789154> >>> y = 123456789155> >>> x is y156> False157> ```158>159> Такое поведение может измениться в будущих версиях CPython. В частности, граница между «малыми» и «большими» целыми числами уже менялась в прошлом.160>161> CPython выдаёт предупреждение [`SyntaxWarning`](https://python-all.ru/3.15/library/exceptions.html#SyntaxWarning) при сравнении литералов с помощью `is`:162>163> ```python164> >>> x = 7165> >>> x is 7166> <input>:1: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?167> True168> ```169>170> Дополнительную информацию см. в разделе [Когда можно полагаться на проверки тождественности с оператором is?](https://python-all.ru/3.15/faq/programming.html#faq-identity-with-is).171172[Шаблонные строки](https://python-all.ru/3.15/reference/lexical_analysis.html#t-strings) неизменяемы, но могут ссылаться на изменяемые объекты в качестве значений [`Interpolation`](https://python-all.ru/3.15/library/string.templatelib.html#string.templatelib.Interpolation). Для целей данного раздела две t-строки считаются имеющими «одинаковое значение», если совпадают как их структура, так и *тождественность* значений.173174**Особенность реализации CPython:** В настоящее время каждое вычисление шаблонной строки приводит к созданию нового объекта.175176#### 6.2.3.2. Конкатенация строковых литералов177178Допускается несколько расположенных рядом строковых или байтовых литералов, возможно, с разными кавычками; их значение равно результату конкатенации:179180```python181>>> "hello" 'world'182"helloworld"183```184185Эта возможность определена на синтаксическом уровне, поэтому работает только с литералами. Для конкатенации строковых выражений во время выполнения можно использовать оператор «+»:186187```python188>>> greeting = "Hello"189>>> space = " "190>>> name = "Blaise"191>>> print(greeting + space + name) # не: print(greeting space name)192Hello Blaise193```194195Конкатенация литералов свободно сочетает неформатированные строки, строки в тройных кавычках и форматированные строковые литералы. Например:196197```python198>>> "Hello" r', ' f"{name}!"199"Hello, Blaise!"200```201202Эту возможность можно использовать для уменьшения количества обратных слешей, для удобного разделения длинных строк на несколько строк или даже для добавления комментариев к частям строки. Например:203204```python205re.compile("[A-Za-z_]" # буква или подчёркивание206 "[A-Za-z0-9_]*" # буква, цифра или подчёркивание207 )208```209210Однако байтовые литералы можно объединять только с другими байтовыми литералами – не со строковыми литералами любого вида. Также шаблонные строковые литералы можно объединять только с другими шаблонными строковыми литералами:211212```python213>>> t"Hello" t"{name}!"214Template(strings=('Hello', '!'), interpolations=(...))215```216217Формально:218219```220221strings: (STRING | fstring)+ | tstring+222```223224### 6.2.4. Группы в круглых скобках225226*Группа в круглых скобках* – это выражение, заключённое в круглые скобки. Группа вычисляется в то же значение, что и выражение внутри.227228Группы используются для переопределения или уточнения [приоритета операторов](https://python-all.ru/3.15/reference/expressions.html#operator-precedence), так же, как в математической записи. Например:229230```python231>>> 3 << 2 | 423212233>>> 3 << (2 | 4) # Переопределяет приоритет оператора | (побитовое ИЛИ)234192235>>> (3 << 2) | 4 # То же, что и без скобок (но более понятно)23612237```238239Обратите внимание: не всё в круглых скобках является *группой*. В частности, группа в круглых скобках должна содержать ровно одно выражение и не может заканчиваться запятой. См. [отображения кортежей](https://python-all.ru/3.15/reference/expressions.html#tuple-display) и [генераторные выражения](https://python-all.ru/3.15/reference/expressions.html#genexpr) для других форм в круглых скобках.240241Формально синтаксис групп:242243```244245group: '(' assignment_expression ')'246```247248### 6.2.5. Отображения контейнеров249250Для создания встроенных контейнеров (списков, множеств, кортежей или словарей) Python предоставляет специальный синтаксис, называемый *отображениями*. Между четырьмя видами отображений есть тонкие различия, подробно описанные в следующих разделах. Однако все отображения состоят из элементов, разделённых запятыми и заключённых в парные разделители.251252Например, *отображение списка* – это последовательность выражений, заключённая в квадратные скобки:253254```python255>>> ["one", "two", "three"]256['one', 'two', 'three']257>>> [1 + 2, 2 + 3]258[3, 5]259```260261В отображениях списка, кортежа и словаря (но не множества) последовательность может быть пустой:262263```python264>>> [] # пустой список265[]266>>> () # пустой кортеж267()268>>> {} # пустой словарь269{}270```271272Если последовательность не пуста, после элементов может стоять дополнительная запятая, которая ни на что не влияет:273274```python275>>> ["one", "two", "three",] # обратите внимание на запятую после "three"276['one', 'two', 'three']277```278279> **Примечание**280>281> Завершающая запятая часто используется в отображениях, занимающих несколько строк (с помощью [неявного объединения строк](https://python-all.ru/3.15/reference/lexical_analysis.html#implicit-joining)), чтобы, когда будущий программист добавит новый элемент в конец, ему не пришлось изменять существующую строку:282>283> ```python284> >>> [285> ... 'one',286> ... 'two',287> ... 'three',288> ... ]289> ['one', 'two', 'three']290> ```291292Во время выполнения, когда отображение вычисляется, перечисленные элементы вычисляются слева направо и помещаются в новый контейнер соответствующего типа.293294Для отображений кортежа, списка и множества (но не словаря) любой элемент отображения может начинаться со звёздочки (`*`). Это обозначает [распаковку итерируемого объекта](https://python-all.ru/3.15/reference/expressions.html#iterable-unpacking). Во время выполнения выражение со звёздочкой должно вычисляться в итерируемый объект, содержимое которого вставляется в контейнер на место распаковки. Например:295296```python297>>> numbers = (1, 2)298>>> [*numbers, 'word', *numbers]299[1, 2, 'word', 1, 2]300```301302Отображения словаря используют похожий механизм, называемый *распаковкой словаря*, который обозначается двойной звёздочкой (`**`). Подробнее см. [Отображения словаря](https://python-all.ru/3.15/reference/expressions.html#dict).303304Более продвинутой формой отображений являются *списковые включения (comprehensions)*, где элементы вычисляются с помощью набора инструкций цикла и фильтрации. Подробнее см. раздел [Comprehensions (списковые включения)](https://python-all.ru/3.15/reference/expressions.html#comprehensions).305306Добавлено в версии 3.5: Распаковка итерируемых объектов и словарей в отображениях, изначально предложено в [**PEP 448**](https://python-all.ru/3.15/reference/expressions.html).307308#### 6.2.5.1. Списковые отображения309310*Отображение списка* – это возможно пустая последовательность выражений, заключённая в квадратные скобки. Например:311312```python313>>> ["one", "two", "three"]314['one', 'two', 'three']315>>> ["one"] # список из одного элемента316['one']317>>> [] # пустой список318[]319```320321Общую информацию об отображениях см. в [Отображениях контейнеров](https://python-all.ru/3.15/reference/expressions.html#displays).322323Формальная грамматика для отображений списков:324325```326327list: '[' [flexible_expression_list] ']'328```329330#### 6.2.5.2. Множественные отображения331332*Отображение множества* – это *непустая* последовательность выражений, заключённая в фигурные скобки. Например:333334```python335>>> {"one", "two", "three"}336{'one', 'three', 'two'}337>>> {"one"} # множество из одного элемента338{'one'}339```340341Общую информацию об отображениях см. в [Отображениях контейнеров](https://python-all.ru/3.15/reference/expressions.html#displays).342343Для пустого множества нет специального синтаксиса. Литерал `{}` – это [отображение словаря](https://python-all.ru/3.15/reference/expressions.html#dict), которое создаёт пустой словарь. Вызовите [`set()`](https://python-all.ru/3.15/library/stdtypes.html#set) без аргументов, чтобы получить пустое множество.344345Формальная грамматика для отображений множеств:346347```348349set: '{' flexible_expression_list '}'350```351352#### 6.2.5.3. Отображения кортежей353354*Отображение кортежа* – это последовательность выражений, заключённая в круглые скобки. Например:355356```python357>>> (1, 2)358(1, 2)359>>> () # пустой кортеж360()361```362363Общую информацию об отображениях см. в [Отображениях контейнеров](https://python-all.ru/3.15/reference/expressions.html#displays).364365Чтобы избежать неоднозначности, если отображение кортежа содержит ровно один элемент, необходима завершающая запятая. Без неё получится [группа в круглых скобках](https://python-all.ru/3.15/reference/expressions.html#parenthesized):366367```python368>>> ('single',) # кортеж из одного элемента369('single',)370>>> ('single') # без запятой: одна строка371'single'372```373374Иными словами, отображение кортежа – это заключённый в скобки список, содержащий:375376- два или более разделённых запятыми выражения, или377- ноль или более выражений, после каждого из которых стоит запятая.378379Поскольку кортежи неизменяемы, [правила идентичности объектов для литералов](https://python-all.ru/3.15/reference/expressions.html#literals-identity) также применимы к кортежам: во время выполнения два вхождения кортежей с одинаковыми значениями могут как дать, так и не дать один и тот же объект.380381> **Примечание**382>383> Синтаксис Python также включает [списки выражений](https://python-all.ru/3.15/reference/expressions.html#exprlists), где разделённый запятыми список выражений *не* заключается в круглые скобки, но результатом его вычисления является кортеж.384>385> Другими словами, при использовании синтаксиса кортежа запятая важнее круглых скобок. Только пустой кортеж записывается без запятой.386387Формальная грамматика для отображений кортежей:388389```390391tuple:392 | '(' flexible_expression (',' flexible_expression)+ [','] ')'393 | '(' flexible_expression ',' ')'394 | '(' ')'395```396397#### 6.2.5.4. Словарные отображения398399*Отображение словаря* – это возможно пустая последовательность *элементов словаря*, заключённая в фигурные скобки. Каждый элемент словаря – это разделённая двоеточием пара выражений: *ключ* и связанное с ним *значение*. Например:400401```python402>>> {1: 'one', 2: 'two'}403{1: 'one', 2: 'two'}404```405406Во время выполнения, при вычислении словарного включения, выражения вычисляются слева направо. Каждый объект ключа используется как ключ словаря для хранения соответствующего значения. Это означает, что в одном включении можно указать один и тот же ключ несколько раз; итоговое значение в словаре для данного ключа будет последним из заданных. Например:407408```python409>>> {410... 1: 'this will be overridden',411... 2: 'two',412... 1: 'also overridden',413... 1: 'one',414... }415{1: 'one', 2: 'two'}416```417418Вместо пары «ключ-значение» элемент словаря может быть выражением с префиксом из двойной звёздочки `**`. Это обозначает *распаковку словаря*. Во время выполнения выражение должно давать [отображение](https://python-all.ru/3.15/glossary.html#term-mapping); каждый элемент отображения добавляется в новый словарь. Как и в случае с парами «ключ-значение», более поздние значения заменяют значения, установленные более ранними элементами и распаковками. Это можно использовать для переопределения набора значений по умолчанию:419420```python421>>> defaults = {'color': 'blue', 'count': 8}422>>> overrides = {'color': 'yellow'}423>>> {**defaults, **overrides}424{'color': 'yellow', 'count': 8}425```426427Добавлено в версии 3.5: Распаковка в словарные отображения, изначально предложенная в [**PEP 448**](https://python-all.ru/3.15/reference/expressions.html).428429Формальная грамматика для отображений словарей:430431```432433dict: '{' [double_starred_kvpairs] '}'434double_starred_kvpairs: ','.double_starred_kvpair+ [',']435double_starred_kvpair: '**' or_expr | kvpair436kvpair: expression ':' expression437```438439### 6.2.6. Включения440441*Включения* списков, множеств и словарей – это разновидность [отображений контейнеров](https://python-all.ru/3.15/reference/expressions.html#displays), в которой элементы вычисляются с помощью набора инструкций цикла и фильтрации, а не перечисляются явно.442443В простейшей форме включение состоит из одного выражения, за которым следует предложение `for`. Предложение `for` имеет тот же синтаксис, что и заголовок [оператора for](https://python-all.ru/3.15/reference/compound_stmts.html#for), но без завершающего двоеточия.444445Например, список первых десяти квадратов:446447```python448>>> [x**2 for x in range(10)]449[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]450```451452Во время выполнения включение списка создаёт новый список. Выражение после `in` должно вычисляться в [итерируемый объект](https://python-all.ru/3.15/glossary.html#term-iterable). Для каждого элемента этого итерируемого объекта элемент связывается с целевой переменной предложения `for`, как в операторе `for`, затем вычисляется выражение перед `for` в области видимости этой целевой переменной, и результат добавляется в новый список. Таким образом, приведённый выше пример примерно эквивалентен определению и вызову следующей функции:453454```python455def make_list_of_squares(iterable):456 result = []457 for x in iterable:458 result.append(x**2)459 return result460461make_list_of_squares(range(10))462```463464Включения множеств работают аналогично. Например, вот множество строчных букв:465466```python467>>> {x.lower() for x in ['a', 'A', 'b', 'C']}468{'c', 'a', 'b'}469```470471Во время выполнения это примерно соответствует вызову следующей функции:472473```python474def make_lowercase_set(iterable):475 result = set(iterable)476 for x in iterable:477 result.append(x.lower())478 return result479480make_lowercase_set(['a', 'A', 'b', 'C'])481```482483Включения словарей начинаются с разделённой двоеточием пары «ключ-значение» вместо выражения. Например:484485```python486>>> {func.__name__: func for func in [print, hex, any]}487{'print': <built-in function print>,488 'hex': <built-in function hex>,489 'any': <built-in function any>}490```491492Во время выполнения это примерно соответствует:493494```python495def make_dict_mapping_names_to_functions(iterable):496 result = {}497 for func in iterable:498 result[func.__name__] = func499 return result500501iterable([print, hex, any])502```503504Как и в других видах отображений словарей, один и тот же ключ может быть указан несколько раз. Более ранние значения перезаписываются теми, что вычисляются позднее.505506*Включений кортежей* не существует. Вместо этого похожий синтаксис используется для [генераторных выражений](https://python-all.ru/3.15/reference/expressions.html#genexpr), из которых можно построить кортеж следующим образом:507508```python509>>> tuple(x**2 for x in range(10))510(0, 1, 4, 9, 16, 25, 36, 49, 64, 81)511```512513Изменено в версии 3.8: До Python 3.8 в словарных включениях порядок вычисления ключа и значения не был строго определён. В CPython значение вычислялось раньше ключа. Начиная с версии 3.8, ключ вычисляется раньше значения, как предложено в [**PEP 572**](https://python-all.ru/3.15/reference/expressions.html).514515#### 6.2.6.1. Фильтрация во включениях516517За предложением `for` может следовать предложение `if` с выражением.518519Например, список имён из модуля [`math`](https://python-all.ru/3.15/library/math.html#module-math), начинающихся с `f`:520521```python522>>> [name for name in vars(math) if name.startswith('f')]523['fabs', 'factorial', 'floor', 'fma', 'fmod', 'frexp', 'fsum']524```525526Во время выполнения выражение после `if` вычисляется перед добавлением каждого элемента в результирующий контейнер, и если оно ложно, элемент пропускается. Таким образом, приведённый выше пример примерно соответствует определению и вызову следующей функции:527528```python529def get_math_f_names(iterable):530 result = []531 for name in iterable:532 if name.startswith('f'):533 result.append(name)534 return result535536get_math_f_names(vars(math))537```538539Фильтрация – это частный случай более сложных включений. Более формальное описание см. в следующем разделе.540541#### 6.2.6.2. Сложные включения542543Обычно за начальным предложением `for` включения может следовать ноль или больше дополнительных предложений `for` или `if`. Например, вот список имён, предоставляемых двумя модулями Python, отфильтрованный так, чтобы включать только имена, начинающиеся с `a`:544545```python546>>> import array547>>> import math548>>> [549... name550... for module in [array, math]551... for name in vars(module)552... if name.startswith('a')553... ]554['array', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh']555```556557Во время выполнения это примерно соответствует определению и вызову:558559```python560def get_a_names(iterable):561 result = []562 for module in iterable:563 for name in vars(module):564 if name.startswith('a'):565 result.append(name)566 return result567568get_a_names([array, math])569```570571Элементами нового контейнера становятся те, которые были бы получены, если рассматривать каждое из предложений `for` или `if` как блок, вкладывать их слева направо и вычислять выражение для получения элемента (или записи словаря) каждый раз при достижении самого внутреннего блока.572573За исключением итерируемого выражения в самой левой части `for`, всё включение выполняется в отдельной неявно вложенной области видимости. Это гарантирует, что имена, присваиваемые в списке целей, не «просачиваются» в окружающую область. Например:574575```python576>>> x = 'old value'577>>> [x**2 for x in range(10)] # этот `x` является локальным для включения578>>> x579'old value'580```581582Итерируемое выражение в самой левой части `for` вычисляется непосредственно в окружающей области видимости, а затем передаётся как аргумент в неявно вложенную область.583584Последующие части `for` и любые условия фильтрации в самой левой части `for` не могут вычисляться в окружающей области видимости, так как могут зависеть от значений, полученных из самого левого итерируемого объекта.585586Чтобы гарантировать, что включение всегда даёт контейнер соответствующего типа, выражения `yield` и `yield from` запрещены в неявно вложенной области видимости.587588[Присваивающие выражения](https://python-all.ru/3.15/reference/expressions.html#assignment-expressions) не допускаются внутри итерируемых выражений включений (то есть выражений после ключевого слова `in`), а также в любом месте включений, которые находятся непосредственно в определении класса.589590Изменено в версии 3.8: `yield` и `yield from` запрещены в неявно вложенной области видимости.591592#### 6.2.6.3. Распаковка во включениях593594Если выражение спискового или множественного включения помечено звёздочкой, результат будет [распакован](https://python-all.ru/3.15/reference/expressions.html#iterable-unpacking) с получением нуля или более элементов.595596Это часто используется для «разворачивания» списков, например:597598```python599>>> students = ['Petr', 'Blaise', 'Jarka']600>>> teachers = ['Salim', 'Bartosz']601>>> lists_of_people = [students, teachers]602>>> [*people for people in lists_of_people]603['Petr', 'Blaise', 'Jarka', 'Salim', 'Bartosz']604```605606Во время выполнения это включение примерно соответствует:607608```python609def flatten_names(lists_of_people):610 result = []611 for people in lists_of_people:612 result.extend(people)613 return result614```615616В словарных включениях выражение с двумя звёздочками вычисляется и затем распаковывается с помощью [распаковки словаря](https://python-all.ru/3.15/reference/expressions.html#dict-unpacking), вставляя ноль или более пар ключ/значение в новый словарь. Как и в других видах отображения словарей, если один и тот же ключ указан несколько раз, соответствующим значением в результирующем словаре будет последнее указанное.617618Например:619620```python621>>> system_defaults = {'color': 'blue', 'count': 8}622>>> user_defaults = {'color': 'yellow'}623>>> overrides = {'count': 5}624625>>> configuration_sets = [system_defaults, user_defaults, overrides]626627>>> {**d for d in configuration_sets}628{'color': 'yellow', 'count': 5}629```630631Добавлено в версии 3.15: Распаковка во включениях с использованием операторов `*` и `**` была введена в [**PEP 798**](https://python-all.ru/3.15/reference/expressions.html).632633#### 6.2.6.4. Асинхронные включения634635В функции [`async def`](https://python-all.ru/3.15/reference/compound_stmts.html#async-def) часть `async for` может использоваться для итерации по [асинхронному итератору](https://python-all.ru/3.15/glossary.html#term-asynchronous-iterator). Включение в функции `async def` может состоять из части `for` или `async for`, следующей за ведущим выражением, может содержать дополнительные части `for` или `async for`, а также может использовать выражения [`await`](https://python-all.ru/3.15/reference/expressions.html#await).636637Если включение содержит части `async for`, или содержит выражения `await` или другие асинхронные включения в любом месте, кроме итерируемого выражения в самой левой части `for`, оно называется *асинхронным включением*. Асинхронное включение может приостанавливать выполнение корутинной функции, в которой оно находится.638639Добавлено в версии 3.6: Асинхронные включения были введены в [**PEP 530**](https://python-all.ru/3.15/reference/expressions.html).640641Изменено в версии 3.11: Асинхронные включения теперь разрешены внутри включений в асинхронных функциях. Внешние включения неявно становятся асинхронными.642643#### 6.2.6.5. Формальная грамматика для включений644645Формальная грамматика для включений:646647```648649listcomp: '[' comprehension ']'650setcomp: '{' comprehension '}'651comprehension: flexible_expression for_if_clause+652653dictcomp:654 | '{' kvpair for_if_clause+ '}'655 | '{' '**' expression for_if_clause+ '}'656657for_if_clause:658 | ['async'] 'for' target_list 'in' or_test ('if' or_test)*659```660661### 6.2.7. Генераторные выражения662663Синтаксис для *генераторных выражений* такой же, как для [списковых включений](https://python-all.ru/3.15/reference/expressions.html#comprehensions), за исключением того, что они заключаются в круглые скобки вместо квадратных. Например:664665```python666>>> iterator = (x ** 2 for x in range(10))667>>> iterator668<generator object <genexpr> at ...>669```670671Во время выполнения генераторное выражение вычисляется в [итератор-генератор](https://python-all.ru/3.15/glossary.html#term-generator-iterator), который возвращает те же значения, что и соответствующее списковое включение:672673```python674>>> list(iterator)675[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]676```677678Таким образом, пример выше примерно эквивалентен определению и вызову следующей генераторной функции:679680```python681def make_generator_of_squares(iterator):682 for x in iterator:683 yield x ** 2684685make_generator_of_squares(iter(range(10)))686```687688The enclosing parentheses can be omitted in calls when the generator expression is the only positional argument and there are no keyword arguments. See the [Calls section](https://python-all.ru/3.15/reference/expressions.html#calls) for details. For example:689690```python691# Круглые скобки после `sum` являются частью синтаксиса вызова:692>>> sum(x ** 2 for x in range(10))693285694695# Генератор требует собственных круглых скобок, если он не единственный аргумент:696>>> sum((x ** 2 for x in range(10)), start=1000)6971285698```699700Итерируемое выражение в крайнем слева предложении `for` вычисляется немедленно, поэтому ошибка, возникшая в этом выражении, будет выдана в точке определения generator-выражения, а не в точке, где запрашивается первое значение:701702```python703>>> (x ** 2 for x in nonexistent_iterable)704Traceback (most recent call last):705 ...706NameError: name 'nonexistent_iterable' is not defined707```708709После вычисления выражения из результата создаётся итератор, как если бы для него вызвали [`iter()`](https://python-all.ru/3.15/library/functions.html#iter). Любая ошибка, возникшая при создании итератора, также выдается немедленно:710711```python712>>> (x ** 2 for x in None)713Traceback (most recent call last):714 ...715TypeError: 'NoneType' object is not iterable716```717718Все остальные выражения вычисляются лениво, так же как и обычные генераторы (то есть когда у итератора запрашивается очередное значение):719720```python721>>> iterator = (nonexistent_value for x in range(10))722>>> iterator723<generator object <genexpr> at ...>724>>> list(iterator)725Traceback (most recent call last):726 ...727NameError: name 'nonexistent_value' is not defined728```729730```python731>>> iterator = (x * y for x in range(10) for y in nonexistent_iterable)732>>> iterator733<generator object <genexpr> at ...>734>>> list(iterator)735Traceback (most recent call last):736 ...737NameError: name 'nonexistent_iterable' is not defined738```739740Чтобы не нарушать ожидаемую работу самого generator-выражения, выражения `yield` и `yield from` запрещены внутри неявно вложенной области видимости.741742Если generator-выражение содержит предложения `async for` или выражения [`await`](https://python-all.ru/3.15/reference/expressions.html#await), оно называется *асинхронным generator-выражением*. Асинхронное generator-выражение возвращает новый асинхронный объект-генератор, который является асинхронным итератором (см. [Асинхронные итераторы](https://python-all.ru/3.15/reference/datamodel.html#async-iterators)).743744Формальная грамматика generator-выражений:745746```747748generator_expression: "(" comprehension ")"749```750751Добавлено в версии 3.6: Появились асинхронные generator-выражения.752753Изменено в версии 3.7: До Python 3.7 асинхронные generator-выражения могли появляться только в корутинах [`async def`](https://python-all.ru/3.15/reference/compound_stmts.html#async-def). Начиная с версии 3.7 любая функция может использовать асинхронные generator-выражения.754755Изменено в версии 3.8: `yield` и `yield from` запрещены в неявно вложенной области видимости.756757### 6.2.8. Выражения yield758759```760761yield_atom: "(" yield_expression ")"762yield_from: "yield" "from" expression763yield_expression: "yield" yield_list | yield_from764```765766The yield expression is used when defining a [generator](https://python-all.ru/3.15/glossary.html#term-generator) function or an [asynchronous generator](https://python-all.ru/3.15/glossary.html#term-asynchronous-generator) function and thus can only be used in the body of a function definition. Using a yield expression in a function’s body causes that function to be a generator function, and using it in an [`async def`](https://python-all.ru/3.15/reference/compound_stmts.html#async-def) function’s body causes that coroutine function to be an asynchronous generator function. For example:767768```python769def gen(): # определяет функцию-генератор770 yield 123771772async def agen(): # определяет асинхронную функцию-генератор773 yield 123774```775776Из-за побочных эффектов на содержащую область видимости, выражения `yield` не допускаются как часть неявно определённых областей видимости, используемых для реализации включений и generator-выражений.777778Изменено в версии 3.8: Выражения yield запрещены в неявно вложенных областях видимости, используемых для реализации включений и generator-выражений.779780Generator functions are described below, while asynchronous generator functions are described separately in section [Asynchronous generator functions](https://python-all.ru/3.15/reference/expressions.html#asynchronous-generator-functions).781782При вызове функции-генератора она возвращает итератор, известный как generator. Этот generator затем управляет выполнением функции-генератора. Выполнение начинается, когда вызывается один из методов generator. В этот момент выполнение доходит до первого выражения yield, где оно снова приостанавливается, возвращая значение [`yield_list`](https://python-all.ru/3.15/reference/expressions.html#grammar-token-python-grammar-yield_list) вызывающему generator, или `None`, если `yield_list` опущено. Под приостановкой подразумевается, что всё локальное состояние сохраняется, включая текущие привязки локальных переменных, указатель команд, внутренний стек вычислений и состояние обработки исключений. Когда выполнение возобновляется вызовом одного из методов generator, функция продолжается точно так, как если бы выражение yield было просто ещё одним внешним вызовом. Значение выражения yield после возобновления зависит от метода, который возобновил выполнение. Если используется [`__next__()`](https://python-all.ru/3.15/reference/expressions.html#generator.__next__) (обычно через [`for`](https://python-all.ru/3.15/reference/compound_stmts.html#for) или встроенную функцию [`next()`](https://python-all.ru/3.15/library/functions.html#next)), то результатом будет [`None`](https://python-all.ru/3.15/library/constants.html#None). В противном случае, если используется [`send()`](https://python-all.ru/3.15/reference/expressions.html#generator.send), то результатом будет значение, переданное этому методу.783784Всё это делает функции-генераторы весьма похожими на корутины; они могут выдавать значения несколько раз, имеют более одной точки входа, и их выполнение может быть приостановлено. Единственное отличие в том, что функция-генератор не может управлять тем, где должно продолжиться выполнение после yield; управление всегда передаётся вызывающему generator.785786Выражения yield разрешены в любом месте конструкции [`try`](https://python-all.ru/3.15/reference/compound_stmts.html#try). Если generator не возобновляется до его завершения (достижение нулевого счётчика ссылок или сборка мусора), будет вызван метод [`close()`](https://python-all.ru/3.15/reference/expressions.html#generator.close) generator-итератора, что позволит выполнить все ожидающие предложения [`finally`](https://python-all.ru/3.15/reference/compound_stmts.html#finally).787788При использовании `yield from <expr>` переданное выражение должно быть итерируемым объектом. Значения, полученные при итерации этого итерируемого объекта, передаются напрямую вызывающему методов текущего generator. Любые значения, переданные через [`send()`](https://python-all.ru/3.15/reference/expressions.html#generator.send), и любые исключения, переданные через [`throw()`](https://python-all.ru/3.15/reference/expressions.html#generator.throw), передаются базовому итератору, если у него есть соответствующие методы. Если это не так, то `send()` возбудит [`AttributeError`](https://python-all.ru/3.15/library/exceptions.html#AttributeError) или [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError), в то время как `throw()` просто немедленно возбудит переданное исключение.789790Когда базовый итератор завершён, атрибут [`value`](https://python-all.ru/3.15/library/exceptions.html#StopIteration.value) возбуждённого экземпляра [`StopIteration`](https://python-all.ru/3.15/library/exceptions.html#StopIteration) становится значением выражения yield. Он может быть установлен явно при возбуждении `StopIteration` или автоматически, когда под-итератор является generator (путём возврата значения из под-генератора).791792Изменено в версии 3.3: Добавлено `yield from <expr>` для делегирования потока управления под-итератору.793794Круглые скобки могут быть опущены, когда выражение yield является единственным выражением в правой части оператора присваивания.795796> **См. также**797>798> **[**PEP 255**](https://python-all.ru/3.15/reference/expressions.html) - Simple Generators**799>800> Предложение по добавлению генераторов и оператора [`yield`](https://python-all.ru/3.15/reference/simple_stmts.html#yield) в Python.801>802> **[**PEP 342**](https://python-all.ru/3.15/reference/expressions.html) - Coroutines via Enhanced Generators**803>804> Предложение по улучшению API и синтаксиса генераторов, позволяющее использовать их как простые корутины.805>806> **[**PEP 380**](https://python-all.ru/3.15/reference/expressions.html) - Syntax for Delegating to a Subgenerator**807>808> Предложение по введению синтаксиса [`yield_from`](https://python-all.ru/3.15/reference/expressions.html#grammar-token-python-grammar-yield_from), упрощающее делегирование под-генераторам.809>810> **[**PEP 525**](https://python-all.ru/3.15/reference/expressions.html) - Asynchronous Generators**811>812> The proposal that expanded on [**PEP 492**](https://python-all.ru/3.15/reference/expressions.html) by adding generator capabilities to coroutine functions.813814#### 6.2.8.1. Методы generator-итератора815816В этом подразделе описаны методы итератора генератора. Они могут использоваться для управления выполнением генераторной функции.817818Обратите внимание, что вызов любого из приведённых ниже методов генератора, когда генератор уже выполняется, приводит к исключению [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError).819820#### `generator.__next__()`821822Запускает выполнение генераторной функции или возобновляет его с последнего выполненного выражения yield. При возобновлении генераторной функции методом `__next__()` текущее выражение yield всегда вычисляется в [`None`](https://python-all.ru/3.15/library/constants.html#None). Затем выполнение продолжается до следующего выражения yield, на котором генератор снова приостанавливается, и значение [`yield_list`](https://python-all.ru/3.15/reference/expressions.html#grammar-token-python-grammar-yield_list) возвращается вызывающему коду `__next__()`. Если генератор завершается, не выдав следующего значения, возбуждается исключение [`StopIteration`](https://python-all.ru/3.15/library/exceptions.html#StopIteration).823824Обычно этот метод вызывается неявно, например, циклом [`for`](https://python-all.ru/3.15/reference/compound_stmts.html#for) или встроенной функцией [`next()`](https://python-all.ru/3.15/library/functions.html#next).825826#### `generator.send(value)`827828Возобновляет выполнение и «отправляет» значение в генераторную функцию. Аргумент *value* становится результатом текущего выражения yield. Метод `send()` возвращает следующее значение, выданное генератором, или возбуждает [`StopIteration`](https://python-all.ru/3.15/library/exceptions.html#StopIteration), если генератор завершается, не выдав другого значения. При вызове `send()` для запуска генератора его необходимо вызывать с аргументом [`None`](https://python-all.ru/3.15/library/constants.html#None), так как нет выражения yield, которое могло бы получить значение.829830#### `generator.throw(value)`831832#### `generator.throw(type[, value[, traceback]])`833834Возбуждает исключение в точке, где генератор был приостановлен, и возвращает следующее значение, выданное генераторной функцией. Если генератор завершается, не выдав другого значения, возбуждается исключение [`StopIteration`](https://python-all.ru/3.15/library/exceptions.html#StopIteration). Если генераторная функция не перехватывает переданное исключение или возбуждает другое исключение, то это исключение распространяется на вызывающий код.835836Обычно этот метод вызывается с одним экземпляром исключения, подобно тому, как используется ключевое слово [`raise`](https://python-all.ru/3.15/reference/simple_stmts.html#raise).837838Однако для обратной совместимости поддерживается вторая сигнатура, следуя соглашению из более старых версий Python. Аргумент *type* должен быть классом исключения, а *value* – экземпляром исключения. Если *value* не указан, вызывается конструктор *type* для получения экземпляра. Если *traceback* предоставлен, он устанавливается в исключении, в противном случае любой существующий атрибут [`__traceback__`](https://python-all.ru/3.15/library/exceptions.html#BaseException.__traceback__), хранящийся в *value*, может быть очищен.839840Изменено в версии 3.12: Вторая сигнатура (type\[, value\[, traceback\]\]) является устаревшей и может быть удалена в будущей версии Python.841842#### `generator.close()`843844Возбуждает исключение [`GeneratorExit`](https://python-all.ru/3.15/library/exceptions.html#GeneratorExit) в точке, где генераторная функция была приостановлена (эквивалентно вызову `throw(GeneratorExit)`). Исключение возбуждается выражением yield, на котором генератор был приостановлен. Если генераторная функция перехватывает исключение и возвращает значение, это значение возвращается из `close()`. Если генераторная функция уже закрыта или возбуждает `GeneratorExit` (не перехватывая исключение), `close()` возвращает [`None`](https://python-all.ru/3.15/library/constants.html#None). Если генератор выдает значение, возбуждается [`RuntimeError`](https://python-all.ru/3.15/library/exceptions.html#RuntimeError). Если генератор возбуждает любое другое исключение, оно распространяется на вызывающий код. Если генератор уже завершился из-за исключения или нормального завершения, `close()` возвращает `None` и не имеет других эффектов.845846Изменено в версии 3.13: Если генератор возвращает значение при закрытии, это значение возвращается методом `close()`.847848#### 6.2.8.2. Примеры849850Вот простой пример, демонстрирующий поведение генераторов и генераторных функций:851852```python853>>> def echo(value=None):854... print("Execution starts when 'next()' is called for the first time.")855... try:856... while True:857... try:858... value = (yield value)859... except Exception as e:860... value = e861... finally:862... print("Don't forget to clean up when 'close()' is called.")863...864>>> generator = echo(1)865>>> print(next(generator))866Execution starts when 'next()' is called for the first time.8671868>>> print(next(generator))869None870>>> print(generator.send(2))8712872>>> generator.throw(TypeError, "spam")873TypeError('spam',)874>>> generator.close()875Don't forget to clean up when 'close()' is called.876```877878Примеры использования `yield from` см. в [PEP 380: Syntax for Delegating to a Subgenerator](https://python-all.ru/3.15/whatsnew/3.3.html#pep-380) в разделе «What’s New in Python».879880#### 6.2.8.3. Асинхронные генераторные функции881882Наличие выражения yield в функции или методе, определённом с помощью [`async def`](https://python-all.ru/3.15/reference/compound_stmts.html#async-def), дополнительно определяет функцию как [асинхронный генератор](https://python-all.ru/3.15/glossary.html#term-asynchronous-generator).883884При вызове асинхронной генераторной функции она возвращает асинхронный итератор, известный как объект асинхронного генератора. Этот объект затем управляет выполнением генераторной функции. Объект асинхронного генератора обычно используется в инструкции [`async for`](https://python-all.ru/3.15/reference/compound_stmts.html#async-for) внутри корутинной функции, аналогично тому, как объект генератора используется в инструкции [`for`](https://python-all.ru/3.15/reference/compound_stmts.html#for).885886Вызов одного из методов асинхронного генератора возвращает [ожидаемый объект](https://python-all.ru/3.15/glossary.html#term-awaitable), и выполнение начинается, когда этот объект ожидается. В этот момент выполнение переходит к первому выражению yield, где оно снова приостанавливается, возвращая значение [`yield_list`](https://python-all.ru/3.15/reference/expressions.html#grammar-token-python-grammar-yield_list) ожидающей корутине. Как и в случае с генератором, приостановка означает, что всё локальное состояние сохраняется, включая текущие привязки локальных переменных, указатель инструкций, внутренний стек вычислений и состояние обработки исключений. Когда выполнение возобновляется путём ожидания следующего объекта, возвращённого методами асинхронного генератора, функция может продолжить работу точно так, как если бы выражение yield было просто ещё одним внешним вызовом. Значение выражения yield после возобновления зависит от метода, который возобновил выполнение. Если используется [`__anext__()`](https://python-all.ru/3.15/reference/expressions.html#agen.__anext__), то результатом будет [`None`](https://python-all.ru/3.15/library/constants.html#None). В противном случае, если используется [`asend()`](https://python-all.ru/3.15/reference/expressions.html#agen.asend), то результатом будет значение, переданное этому методу.887888Если асинхронный генератор завершается досрочно из-за [`break`](https://python-all.ru/3.15/reference/simple_stmts.html#break), отмены задачи вызывающего кода или других исключений, запускается код асинхронной очистки генератора, который может возбудить исключения или получить доступ к переменным контекста в неожиданном контексте – возможно, после завершения времени жизни задач, от которых он зависит, или во время завершения цикла событий, когда вызывается сборщик мусора асинхронных генераторов. Чтобы предотвратить это, вызывающий код должен явно закрыть асинхронный генератор, вызвав метод [`aclose()`](https://python-all.ru/3.15/reference/expressions.html#agen.aclose) для финализации генератора и окончательного отсоединения его от цикла событий.889890В асинхронной генераторной функции выражения yield разрешены в любом месте конструкции [`try`](https://python-all.ru/3.15/reference/compound_stmts.html#try). Однако если асинхронный генератор не был возобновлён до финализации (достижение нулевого счётчика ссылок или сборка мусора), то выражение yield внутри конструкции `try` может привести к невозможности выполнить ожидающие предложения [`finally`](https://python-all.ru/3.15/reference/compound_stmts.html#finally). В этом случае цикл событий или планировщик, выполняющий асинхронный генератор, должен вызвать метод [`aclose()`](https://python-all.ru/3.15/reference/expressions.html#agen.aclose) итератора асинхронного генератора и запустить полученный объект корутины, чтобы позволить выполниться ожидающим предложениям `finally`.891892Чтобы обеспечить финализацию при завершении цикла событий, цикл событий должен определить функцию *финализатор*, которая принимает итератор асинхронного генератора и, предположительно, вызывает [`aclose()`](https://python-all.ru/3.15/reference/expressions.html#agen.aclose) и выполняет корутину. Этот *финализатор* может быть зарегистрирован вызовом [`sys.set_asyncgen_hooks()`](https://python-all.ru/3.15/library/sys.html#sys.set_asyncgen_hooks). При первой итерации итератор асинхронного генератора сохранит зарегистрированный *финализатор* для вызова при финализации. Пример реализации метода *финализатор* см. в реализации `asyncio.Loop.shutdown_asyncgens` в [Lib/asyncio/base\_events.py](https://python-all.ru/src/3.15/Lib/asyncio/base_events.py).893894Выражение `yield from <expr>` является синтаксической ошибкой при использовании в асинхронной генераторной функции.895896#### 6.2.8.4. Методы итератора асинхронного генератора897898В этом подразделе описаны методы итератора асинхронного генератора, которые используются для управления выполнением генераторной функции.899900#### `async agen.__anext__()`901902Возвращает ожидаемый объект, который при выполнении запускает асинхронный генератор или возобновляет его с последнего выполненного выражения yield. Когда асинхронная генераторная функция возобновляется методом `__anext__()`, текущее выражение yield всегда вычисляется в [`None`](https://python-all.ru/3.15/library/constants.html#None) в возвращаемом ожидаемом объекте, который при выполнении продолжает работу до следующего выражения yield. Значение [`yield_list`](https://python-all.ru/3.15/reference/expressions.html#grammar-token-python-grammar-yield_list) выражения yield - это значение исключения [`StopIteration`](https://python-all.ru/3.15/library/exceptions.html#StopIteration), возбуждённого завершаемой корутиной. Если асинхронный генератор завершается, не выдав другого значения, ожидаемый объект вместо этого возбуждает исключение [`StopAsyncIteration`](https://python-all.ru/3.15/library/exceptions.html#StopAsyncIteration), сигнализируя о завершении асинхронной итерации.903904Обычно этот метод вызывается неявно циклом [`async for`](https://python-all.ru/3.15/reference/compound_stmts.html#async-for).905906#### `async agen.asend(value)`907908Возвращает ожидаемый объект, который при запуске возобновляет выполнение асинхронного генератора. Как и в случае метода [`send()`](https://python-all.ru/3.15/reference/expressions.html#generator.send) для генератора, этот «отправляет» значение в асинхронную функцию-генератор, и аргумент *value* становится результатом текущего выражения yield. Ожидаемый объект, возвращённый методом `asend()`, вернёт следующее значение, выданное генератором, как значение возбуждённого [`StopIteration`](https://python-all.ru/3.15/library/exceptions.html#StopIteration), или возбуждает [`StopAsyncIteration`](https://python-all.ru/3.15/library/exceptions.html#StopAsyncIteration), если асинхронный генератор завершится, не выдав другого значения. Когда `asend()` вызывается для запуска асинхронного генератора, он должен быть вызван с аргументом [`None`](https://python-all.ru/3.15/library/constants.html#None), потому что нет выражения yield, которое могло бы получить значение.909910#### `async agen.athrow(value)`911912#### `async agen.athrow(type[, value[, traceback]])`913914Возвращает ожидаемый объект, который возбуждает исключение типа `type` в точке, где асинхронный генератор был приостановлен, и возвращает следующее значение, выданное функцией-генератором, как значение возбуждённого исключения [`StopIteration`](https://python-all.ru/3.15/library/exceptions.html#StopIteration). Если асинхронный генератор завершается, не выдав другого значения, ожидаемый объект возбуждает исключение [`StopAsyncIteration`](https://python-all.ru/3.15/library/exceptions.html#StopAsyncIteration). Если функция-генератор не перехватывает переданное исключение или возбуждает другое исключение, то при запуске ожидаемого объекта это исключение распространяется на вызывающую сторону.915916Изменено в версии 3.12: Вторая сигнатура (type\[, value\[, traceback\]\]) является устаревшей и может быть удалена в будущей версии Python.917918#### `async agen.aclose()`919920Возвращает ожидаемый объект, который при запуске вызовет [`GeneratorExit`](https://python-all.ru/3.15/library/exceptions.html#GeneratorExit) в асинхронную функцию-генератор в точке, где она была приостановлена. Если асинхронная функция-генератор затем завершается нормально, уже закрыта или возбуждает `GeneratorExit` (не перехватив исключение), то возвращаемый ожидаемый объект возбудит исключение [`StopIteration`](https://python-all.ru/3.15/library/exceptions.html#StopIteration). Любые последующие ожидаемые объекты, возвращённые вызовами асинхронного генератора, будут возбуждать исключение [`StopAsyncIteration`](https://python-all.ru/3.15/library/exceptions.html#StopAsyncIteration). Если асинхронный генератор выдаёт значение, ожидаемый объект возбуждает [`RuntimeError`](https://python-all.ru/3.15/library/exceptions.html#RuntimeError). Если асинхронный генератор возбуждает любое другое исключение, оно распространяется на вызывающую сторону ожидаемого объекта. Если асинхронный генератор уже завершился по причине исключения или нормального завершения, то последующие вызовы `aclose()` возвратят ожидаемый объект, который ничего не делает.921922## 6.3. Первичные выражения923924Первичные выражения представляют операции с самой высокой связностью в языке. Их синтаксис:925926```927928primary: atom | attributeref | subscription | call929```930931### 6.3.1. Ссылки на атрибуты932933Ссылка на атрибут – это первичное выражение, за которым следуют точка и имя:934935```936937attributeref: primary "." identifier938```939940Первичное выражение должно вычисляться в объект типа, поддерживающего ссылки на атрибуты (большинство объектов это делают). Затем у этого объекта запрашивается атрибут с указанным идентификатором. Тип и значение полученного атрибута определяются объектом. При многократных вычислениях одной и той же ссылки на атрибут могут получаться разные объекты.941942Это поведение можно настроить, переопределив метод [`__getattribute__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getattribute__) или метод [`__getattr__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getattr__). Сначала вызывается метод `__getattribute__()`, который либо возвращает значение, либо возбуждает [`AttributeError`](https://python-all.ru/3.15/library/exceptions.html#AttributeError), если атрибут недоступен.943944Если возбуждено [`AttributeError`](https://python-all.ru/3.15/library/exceptions.html#AttributeError) и у объекта есть метод `__getattr__()`, этот метод вызывается как запасной вариант.945946### 6.3.2. Извлечение элементов и срезы947948Синтаксис *извлечения элемента* обычно используется для выбора элемента из [контейнера](https://python-all.ru/3.15/reference/datamodel.html#sequence-types) – например, для получения значения из [`dict`](https://python-all.ru/3.15/library/stdtypes.html#dict):949950```python951>>> digits_by_name = {'one': 1, 'two': 2}952>>> digits_by_name['two'] # Индексирование словаря по ключу 'two'9532954```955956В синтаксисе извлечения элемента объект, из которого извлекается элемент – [первичное выражение](https://python-all.ru/3.15/reference/expressions.html#primaries) – за которым следует *подписка* в квадратных скобках. В простейшем случае подписка представляет собой одно выражение.957958В зависимости от типа объекта, из которого извлекается элемент, подписка иногда называется [ключом](https://python-all.ru/3.15/glossary.html#term-key) (для отображений), [индексом](https://python-all.ru/3.15/glossary.html#term-index) (для последовательностей) или *аргументом типа* (для [обобщённых типов](https://python-all.ru/3.15/glossary.html#term-generic-type)). Синтаксически все они эквивалентны:959960```python961>>> colors = ['red', 'blue', 'green', 'black']962>>> colors[3] # Индексирование списка по индексу 3963'black'964965>>> list[str] # Параметризация типа списка с помощью аргумента типа str966list[str]967```968969Во время выполнения интерпретатор вычисляет первичное выражение и подписку, и вызывает [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__) или [`__class_getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__class_getitem__) [специальный метод](https://python-all.ru/3.15/glossary.html#term-special-method) первичного выражения с подпиской в качестве аргумента. Подробнее о том, какой из этих методов вызывается, см. в [\_\_class\_getitem\_\_ и \_\_getitem\_\_](https://python-all.ru/3.15/reference/datamodel.html#classgetitem-versus-getitem).970971Чтобы показать, как работает извлечение элемента, можно определить пользовательский объект, реализующий [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__) и выводящий значение подписки:972973```python974>>> class SubscriptionDemo:975... def __getitem__(self, key):976... print(f'subscripted with: {key!r}')977...978>>> demo = SubscriptionDemo()979>>> demo[1]980subscripted with: 1981>>> demo['a' * 3]982subscripted with: 'aaa'983```984985См. документацию [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__) о том, как встроенные типы обрабатывают извлечение элемента.986987Извлечение элемента также может использоваться как цель в операторах [присваивания](https://python-all.ru/3.15/reference/simple_stmts.html#assignment) или [удаления](https://python-all.ru/3.15/reference/simple_stmts.html#del). В этих случаях интерпретатор вызывает соответственно [`__setitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__setitem__) или [`__delitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__delitem__) [специальный метод](https://python-all.ru/3.15/glossary.html#term-special-method) объекта, у которого извлекается элемент, вместо [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__).988989```python990>>> colors = ['red', 'blue', 'green', 'black']991>>> colors[3] = 'white' # Установка элемента по индексу992>>> colors993['red', 'blue', 'green', 'white']994>>> del colors[3] # Удаление элемента по индексу 3995>>> colors996['red', 'blue', 'green']997```998999Все расширенные формы *подписки*, описанные в следующих разделах, также применимы для присваивания и удаления.10001001#### 6.3.2.1. Срезы10021003Более продвинутая форма извлечения элемента – *срез* – обычно используется для извлечения части [последовательности](https://python-all.ru/3.15/reference/datamodel.html#datamodel-sequences). В этой форме подписка представляет собой [срез](https://python-all.ru/3.15/glossary.html#term-slice): до трёх выражений, разделённых двоеточиями. Любое из выражений может быть опущено, но срез должен содержать хотя бы одно двоеточие:10041005```python1006>>> number_names = ['zero', 'one', 'two', 'three', 'four', 'five']1007>>> number_names[1:3]1008['one', 'two']1009>>> number_names[1:]1010['one', 'two', 'three', 'four', 'five']1011>>> number_names[:3]1012['zero', 'one', 'two']1013>>> number_names[:]1014['zero', 'one', 'two', 'three', 'four', 'five']1015>>> number_names[::2]1016['zero', 'two', 'four']1017>>> number_names[:-3]1018['zero', 'one', 'two']1019>>> del number_names[4:]1020>>> number_names1021['zero', 'one', 'two', 'three']1022```10231024Когда срез вычисляется, интерпретатор создаёт объект [`slice`](https://python-all.ru/3.15/library/functions.html#slice), чьи атрибуты [`start`](https://python-all.ru/3.15/library/functions.html#slice.start), [`stop`](https://python-all.ru/3.15/library/functions.html#slice.stop) и [`step`](https://python-all.ru/3.15/library/functions.html#slice.step) соответственно являются результатами выражений между двоеточиями. Любое пропущенное выражение вычисляется в [`None`](https://python-all.ru/3.15/library/constants.html#None). Затем этот объект `slice` передаётся методу [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__) или [`__class_getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__class_getitem__) [специальный метод](https://python-all.ru/3.15/glossary.html#term-special-method), как указано выше.10251026```python1027# продолжение с экземпляром SubscriptionDemo, определённым выше:1028>>> demo[2:3]1029subscripted with: slice(2, 3, None)1030>>> demo[::'spam']1031subscripted with: slice(None, None, 'spam')1032```10331034#### 6.3.2.2. Подписки, разделённые запятыми10351036Подписка также может быть задана в виде двух или более выражений или срезов, разделённых запятыми:10371038```python1039# продолжение с экземпляром SubscriptionDemo, определённым выше:1040>>> demo[1, 2, 3]1041subscripted with: (1, 2, 3)1042>>> demo[1:2, 3]1043subscripted with: (slice(1, 2, None), 3)1044```10451046Эта форма обычно используется в числовых библиотеках для нарезки многомерных данных. В этом случае интерпретатор создаёт [`tuple`](https://python-all.ru/3.15/library/stdtypes.html#tuple) из результатов выражений или срезов и передаёт этот кортеж методу [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__) или [`__class_getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__class_getitem__) [специальный метод](https://python-all.ru/3.15/glossary.html#term-special-method), как указано выше.10471048Подписка также может быть задана в виде одного выражения или среза, за которым следует запятая, чтобы указать кортеж из одного элемента:10491050```python1051>>> demo['spam',]1052subscripted with: ('spam',)1053```10541055#### 6.3.2.3. Подписки со звёздочкой10561057Добавлено в версии 3.11: Выражения в *tuple\_slices* могут содержать звёздочку. См. [**PEP 646**](https://python-all.ru/3.15/reference/expressions.html).10581059Индекс также может содержать выражение со звёздочкой. В этом случае интерпретатор распаковывает результат в кортеж и передаёт этот кортеж в [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__) или [`__class_getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__class_getitem__):10601061```python1062# продолжение с экземпляром SubscriptionDemo, определённым выше:1063>>> demo[*range(10)]1064subscripted with: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)1065```10661067Выражения со звёздочкой можно комбинировать с выражениями, разделёнными запятыми, и срезами:10681069```python1070>>> demo['a', 'b', *range(3), 'c']1071subscripted with: ('a', 'b', 0, 1, 2, 'c')1072```10731074#### 6.3.2.4. Формальная грамматика индексирования10751076```10771078subscription: primary '[' subscript ']'1079subscript: single_subscript | tuple_subscript1080single_subscript: proper_slice | assignment_expression1081proper_slice: [expression] ":" [expression] [ ":" [expression] ]1082tuple_subscript: ','.(single_subscript | starred_expression)+ [',']1083```10841085Напомним, что оператор `|` [обозначает упорядоченный выбор](https://python-all.ru/3.15/reference/introduction.html#notation). В частности, в `subscript`, если обе альтернативы совпадают, приоритет имеет первая (`single_subscript`).10861087### 6.3.3. Вызовы10881089Вызов – это обращение к вызываемому объекту (например, [функции](https://python-all.ru/3.15/glossary.html#term-function)) с возможно пустой последовательностью [аргументов](https://python-all.ru/3.15/glossary.html#term-argument):10901091```10921093call: primary "(" [argument_list [","] | comprehension] ")"1094argument_list: positional_arguments ["," starred_and_keywords]1095 ["," keywords_arguments]1096 | starred_and_keywords ["," keywords_arguments]1097 | keywords_arguments1098positional_arguments: positional_item ("," positional_item)*1099positional_item: assignment_expression | "*" expression1100starred_and_keywords: ("*" expression | keyword_item)1101 ("," "*" expression | "," keyword_item)*1102keywords_arguments: (keyword_item | "**" expression)1103 ("," keyword_item | "," "**" expression)*1104keyword_item: identifier "=" expression1105```11061107После позиционных и именованных аргументов может стоять необязательная завершающая запятая, но на семантику это не влияет.11081109Первичное выражение должно принимать значение вызываемого объекта (вызываемыми являются: функции, определённые пользователем, встроенные функции, методы встроенных объектов, объекты классов, методы экземпляров классов и все объекты, имеющие метод [`__call__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__call__)). Все выражения аргументов вычисляются до попытки вызова. За синтаксисом списков формальных [параметров](https://python-all.ru/3.15/glossary.html#term-parameter) обращайтесь к разделу [Определения функций](https://python-all.ru/3.15/reference/compound_stmts.html#function).11101111Если присутствуют именованные аргументы, они сначала преобразуются в позиционные следующим образом. Сначала создаётся список незаполненных слотов для формальных параметров. Если есть N позиционных аргументов, они помещаются в первые N слотов. Затем для каждого именованного аргумента идентификатор используется для определения соответствующего слота (если идентификатор совпадает с именем первого формального параметра, используется первый слот и так далее). Если слот уже занят, возбуждается исключение [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError). В противном случае аргумент помещается в слот, заполняя его (даже если выражение равно `None`, оно заполняет слот). Когда все аргументы обработаны, слоты, которые всё ещё не заполнены, заполняются соответствующим значением по умолчанию из определения функции. (Значения по умолчанию вычисляются один раз при определении функции; таким образом, изменяемый объект, такой как список или словарь, используемый в качестве значения по умолчанию, будет общим для всех вызовов, которые не указывают значение аргумента для соответствующего слота; этого обычно следует избегать.) Если остались незаполненные слоты, для которых не указано значение по умолчанию, возбуждается исключение `TypeError`. В противном случае список заполненных слотов используется как список аргументов для вызова.11121113**Особенность реализации CPython:** Реализация может предоставлять встроенные функции, чьи позиционные параметры не имеют имён, даже если они «названы» для целей документации, и поэтому их нельзя передать по ключевому слову. В CPython это относится к функциям, реализованным на C, которые используют [`PyArg_ParseTuple()`](https://python-all.ru/3.15/c-api/arg.html#c.PyArg_ParseTuple) для разбора своих аргументов.11141115Если позиционных аргументов больше, чем слотов формальных параметров, возбуждается исключение [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError), если только не присутствует формальный параметр с синтаксисом `*identifier`; в этом случае этот формальный параметр получает кортеж, содержащий лишние позиционные аргументы (или пустой кортеж, если лишних позиционных аргументов не было).11161117Если какой-либо именованный аргумент не соответствует имени формального параметра, возбуждается исключение [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError), если только не присутствует формальный параметр с синтаксисом `**identifier`; в этом случае этот формальный параметр получает словарь, содержащий лишние именованные аргументы (с ключами в качестве имён и значениями аргументов в качестве соответствующих значений), или (новый) пустой словарь, если лишних именованных аргументов не было.11181119Если в вызове функции присутствует синтаксис `*expression`, `expression` должен принимать значение [итерируемого объекта](https://python-all.ru/3.15/glossary.html#term-iterable). Элементы из этих итерируемых объектов рассматриваются как дополнительные позиционные аргументы. Для вызова `f(x1, x2, *y, x3, x4)`, если *y* принимает значение последовательности *y1*, …, *yM*, это эквивалентно вызову с M+4 позиционными аргументами *x1*, *x2*, *y1*, …, *yM*, *x3*, *x4*.11201121Следствием этого является то, что хотя синтаксис `*expression` может появляться *после* явных именованных аргументов, он обрабатывается *до* именованных аргументов (и любых аргументов `**expression` – см. ниже). Итак:11221123```python1124>>> def f(a, b):1125... print(a, b)1126...1127>>> f(b=1, *(2,))11282 11129>>> f(a=1, *(2,))1130Traceback (most recent call last):1131 File "<stdin>", line 1, in <module>1132TypeError: f() got multiple values for keyword argument 'a'1133>>> f(1, *(2,))11341 21135```11361137Обычно именованные аргументы и синтаксис `*expression` не используются в одном вызове, поэтому на практике такая путаница возникает редко.11381139Если в вызове функции присутствует синтаксис `**expression`, `expression` должен принимать значение [отображения](https://python-all.ru/3.15/glossary.html#term-mapping), содержимое которого рассматривается как дополнительные именованные аргументы. Если параметру, соответствующему ключу, уже было присвоено значение (явным именованным аргументом или из другой распаковки), возбуждается исключение [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError).11401141При использовании `**expression` каждый ключ в этом отображении должен быть строкой. Каждое значение из отображения присваивается первому формальному параметру, доступному для присваивания по ключевому слову, чьё имя равно ключу. Ключ не обязательно должен быть идентификатором Python (например, `"max-temp °F"` допустимо, хотя он не будет соответствовать ни одному формальному параметру, который можно объявить). Если соответствия формальному параметру нет, пара ключ-значение собирается параметром `**`, если он есть, или, если его нет, возбуждается исключение [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError).11421143Формальные параметры с синтаксисом `*identifier` или `**identifier` не могут использоваться как слоты позиционных аргументов или как имена именованных аргументов.11441145Изменено в версии 3.5: Вызовы функций принимают любое количество распаковок `*` и `**`, позиционные аргументы могут следовать за распаковками итерируемых объектов (`*`), а именованные аргументы – за распаковками словарей (`**`). Изначально предложено в [**PEP 448**](https://python-all.ru/3.15/reference/expressions.html).11461147Вызов всегда возвращает некоторое значение, возможно `None`, если только не возбуждается исключение. Как вычисляется это значение, зависит от типа вызываемого объекта.11481149Если это–11501151**пользовательская функция:**11521153Выполняется блок кода функции, которому передаётся список аргументов. Первое, что делает блок кода, – связывает формальные параметры с аргументами; это описано в разделе [Определения функций](https://python-all.ru/3.15/reference/compound_stmts.html#function). Когда блок кода выполняет оператор [`return`](https://python-all.ru/3.15/reference/simple_stmts.html#return), он задаёт возвращаемое значение вызова функции. Если выполнение достигает конца блока кода без выполнения оператора `return`, возвращаемое значение равно `None`.11541155**встроенная функция или метод:**11561157Результат зависит от интерпретатора; описания встроенных функций и методов см. в [Встроенные функции](https://python-all.ru/3.15/library/functions.html#built-in-funcs).11581159**объект класса:**11601161Возвращается новый экземпляр этого класса.11621163**метод экземпляра класса:**11641165Вызывается соответствующая пользовательская функция, со списком аргументов, который на один длиннее списка аргументов вызова: экземпляр становится первым аргументом.11661167**экземпляр класса:**11681169Класс должен определять метод [`__call__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__call__); результат будет таким же, как если бы был вызван этот метод.11701171## 6.4. Выражение await11721173Приостанавливает выполнение [корутины](https://python-all.ru/3.15/glossary.html#term-coroutine) на [ожидаемом объекте](https://python-all.ru/3.15/glossary.html#term-awaitable). Может использоваться только внутри [корутинной функции](https://python-all.ru/3.15/glossary.html#term-coroutine-function).11741175```11761177await_expr: "await" primary1178```11791180Добавлено в версии 3.5.11811182## 6.5. Оператор возведения в степень11831184Оператор возведения в степень имеет более высокий приоритет, чем унарные операторы слева, и более низкий приоритет, чем унарные операторы справа. Синтаксис:11851186```11871188power: (await_expr | primary) ["**" u_expr]1189```11901191Таким образом, в последовательности операторов возведения в степень и унарных операторов без скобок операторы вычисляются справа налево (это не накладывает ограничений на порядок вычисления операндов): `-1**2` даёт `-1`.11921193Оператор возведения в степень имеет ту же семантику, что и встроенная функция [`pow()`](https://python-all.ru/3.15/library/functions.html#pow), вызванная с двумя аргументами: он возвращает левый аргумент, возведённый в степень правого аргумента. Числовые аргументы сначала [преобразуются к общему типу](https://python-all.ru/3.15/library/stdtypes.html#stdtypes-mixed-arithmetic), и результат имеет этот тип.11941195Для операндов типа int результат имеет тот же тип, что и операнды, если только второй аргумент не отрицателен; в этом случае все аргументы преобразуются в float и возвращается результат типа float. Например, `10**2` возвращает `100`, но `10**-2` возвращает `0.01`.11961197Возведение `0.0` в отрицательную степень приводит к [`ZeroDivisionError`](https://python-all.ru/3.15/library/exceptions.html#ZeroDivisionError). Возведение отрицательного числа в дробную степень даёт [`complex`](https://python-all.ru/3.15/library/functions.html#complex) число. (В более ранних версиях это вызывало [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError).)11981199Эту операцию можно настроить с помощью специальных методов [`__pow__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__pow__) и [`__rpow__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rpow__).12001201## 6.6. Унарные арифметические и побитовые операции12021203Все унарные арифметические и побитовые операции имеют одинаковый приоритет:12041205```12061207u_expr: power | "-" u_expr | "+" u_expr | "~" u_expr1208```12091210Унарный оператор `-` (минус) возвращает отрицание своего числового аргумента; эту операцию можно переопределить с помощью специального метода [`__neg__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__neg__).12111212Унарный оператор `+` (плюс) возвращает свой числовой аргумент без изменений; эту операцию можно переопределить с помощью специального метода [`__pos__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__pos__).12131214Унарный оператор `~` (инверсия) возвращает побитовую инверсию своего целочисленного аргумента. Побитовая инверсия `x` определяется как `-(x+1)`. Он применим только к целым числам или пользовательским объектам, переопределяющим специальный метод [`__invert__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__invert__).12151216Во всех трёх случаях, если аргумент имеет неправильный тип, вызывается исключение [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError).12171218## 6.7. Бинарные арифметические операции12191220Бинарные арифметические операции имеют общепринятые уровни приоритета. Обратите внимание, что некоторые из этих операций также применимы к некоторым нечисловым типам. За исключением оператора возведения в степень, существует только два уровня: один для мультипликативных операторов и один для аддитивных операторов:12211222```12231224m_expr: u_expr | m_expr "*" u_expr | m_expr "@" m_expr |1225 m_expr "//" u_expr | m_expr "/" u_expr |1226 m_expr "%" u_expr1227a_expr: m_expr | a_expr "+" m_expr | a_expr "-" m_expr1228```12291230Оператор `*` (умножение) возвращает произведение своих аргументов. Аргументы должны быть либо оба числами, либо один аргумент – целым числом, а другой – последовательностью. В первом случае числа [преобразуются к общему вещественному типу](https://python-all.ru/3.15/library/stdtypes.html#stdtypes-mixed-arithmetic), а затем перемножаются. Во втором случае выполняется повторение последовательности; отрицательный коэффициент повторения даёт пустую последовательность.12311232Эту операцию можно настроить с помощью специальных методов [`__mul__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__mul__) и [`__rmul__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rmul__).12331234Изменено в версии 3.14: Если только один операнд является комплексным числом, другой операнд преобразуется в число с плавающей запятой.12351236Оператор `@` (at) предназначен для умножения матриц. Ни один встроенный тип Python не реализует этот оператор.12371238Эту операцию можно настроить с помощью специальных методов [`__matmul__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__matmul__) и [`__rmatmul__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rmatmul__).12391240Добавлено в версии 3.5.12411242Операторы `/` (деление) и `//` (целочисленное деление) возвращают частное своих аргументов. Числовые аргументы сначала [преобразуются к общему типу](https://python-all.ru/3.15/library/stdtypes.html#stdtypes-mixed-arithmetic). Деление целых чисел даёт float, а целочисленное деление целых чисел даёт целое число; результат представляет собой математическое деление с применением функции 'floor' к результату. Деление на ноль вызывает исключение [`ZeroDivisionError`](https://python-all.ru/3.15/library/exceptions.html#ZeroDivisionError).12431244Операцию деления можно настроить с помощью специальных методов [`__truediv__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__truediv__) и [`__rtruediv__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rtruediv__). Операцию целочисленного деления можно настроить с помощью специальных методов [`__floordiv__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__floordiv__) и [`__rfloordiv__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rfloordiv__).12451246Оператор `%` (остаток от деления) возвращает остаток от деления первого аргумента на второй. Числовые аргументы сначала [преобразуются к общему типу](https://python-all.ru/3.15/library/stdtypes.html#stdtypes-mixed-arithmetic). Нулевой правый аргумент вызывает исключение [`ZeroDivisionError`](https://python-all.ru/3.15/library/exceptions.html#ZeroDivisionError). Аргументы могут быть числами с плавающей точкой, например, `3.14%0.7` равно `0.34` (поскольку `3.14` равно `4*0.7 + 0.34`). Оператор остатка всегда возвращает результат с тем же знаком, что и второй операнд (или ноль); абсолютное значение результата строго меньше абсолютного значения второго операнда [\[1\]](https://python-all.ru/3.15/reference/expressions.html#id22).12471248Операторы целочисленного деления и остатка связаны следующим тождеством: `x == (x//y)*y + (x%y)`. Целочисленное деление и остаток также связаны со встроенной функцией [`divmod()`](https://python-all.ru/3.15/library/functions.html#divmod): `divmod(x, y) == (x//y, x%y)`. [\[2\]](https://python-all.ru/3.15/reference/expressions.html#id23).12491250Помимо выполнения операции взятия остатка над числами, оператор `%` также перегружается строковыми объектами для выполнения форматирования строк в старом стиле (также известного как интерполяция). Синтаксис форматирования строк описан в справочнике по библиотеке Python, раздел [Форматирование строк в стиле printf](https://python-all.ru/3.15/library/stdtypes.html#old-string-formatting).12511252Операцию *взятия остатка* можно настроить с помощью специальных методов [`__mod__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__mod__) и [`__rmod__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rmod__).12531254Оператор целочисленного деления, оператор остатка и функция [`divmod()`](https://python-all.ru/3.15/library/functions.html#divmod) не определены для комплексных чисел. Вместо этого преобразуйте в число с плавающей точкой с помощью функции [`abs()`](https://python-all.ru/3.15/library/functions.html#abs), если это уместно.12551256Оператор `+` (сложение) возвращает сумму своих аргументов. Аргументы должны быть либо оба числами, либо обеими последовательностями одного типа. В первом случае числа [преобразуются к общему вещественному типу](https://python-all.ru/3.15/library/stdtypes.html#stdtypes-mixed-arithmetic), а затем складываются. Во втором случае последовательности конкатенируются.12571258Эту операцию можно настроить с помощью специальных методов [`__add__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__add__) и [`__radd__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__radd__).12591260Изменено в версии 3.14: Если только один операнд является комплексным числом, другой операнд преобразуется в число с плавающей запятой.12611262Оператор `-` (вычитание) возвращает разность своих аргументов. Числовые аргументы сначала [преобразуются к общему вещественному типу](https://python-all.ru/3.15/library/stdtypes.html#stdtypes-mixed-arithmetic).12631264Эту операцию можно настроить с помощью специальных методов [`__sub__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__sub__) и [`__rsub__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rsub__).12651266Изменено в версии 3.14: Если только один операнд является комплексным числом, другой операнд преобразуется в число с плавающей запятой.12671268## 6.8. Операции сдвига12691270Операции сдвига имеют более низкий приоритет, чем арифметические операции:12711272```12731274shift_expr: a_expr | shift_expr ("<<" | ">>") a_expr1275```12761277Эти операторы принимают целые числа в качестве аргументов. Они сдвигают первый аргумент влево или вправо на количество бит, заданное вторым аргументом.12781279Операцию левого сдвига можно настроить с помощью специальных методов [`__lshift__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__lshift__) и [`__rlshift__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rlshift__). Операцию правого сдвига можно настроить с помощью специальных методов [`__rshift__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rshift__) и [`__rrshift__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rrshift__).12801281Правый сдвиг на *n* бит определяется как целочисленное деление на `pow(2,n)`. Левый сдвиг на *n* бит определяется как умножение на `pow(2,n)`.12821283## 6.9. Двоичные побитовые операции12841285Каждая из трёх побитовых операций имеет свой уровень приоритета:12861287```12881289and_expr: shift_expr | and_expr "&" shift_expr1290xor_expr: and_expr | xor_expr "^" and_expr1291or_expr: xor_expr | or_expr "|" xor_expr1292```12931294Оператор `&` возвращает побитовое И (AND) своих аргументов, которые должны быть целыми числами, или один из них должен быть пользовательским объектом, переопределяющим специальные методы [`__and__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__and__) или [`__rand__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rand__).12951296Оператор `^` возвращает побитовое исключающее ИЛИ (XOR) своих аргументов, которые должны быть целыми числами, или один из них должен быть пользовательским объектом, переопределяющим специальные методы [`__xor__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__xor__) или [`__rxor__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__rxor__).12971298Оператор `|` возвращает побитовое (включающее) ИЛИ (OR) своих аргументов, которые должны быть целыми числами, или один из них должен быть пользовательским объектом, переопределяющим специальные методы [`__or__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__or__) или [`__ror__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__ror__).12991300## 6.10. Сравнения13011302В отличие от C, все операции сравнения в Python имеют одинаковый приоритет, который ниже приоритета любых арифметических, сдвиговых или побитовых операций. Также в отличие от C, выражения вида `a < b < c` интерпретируются так, как принято в математике:13031304```13051306comparison: or_expr (comp_operator or_expr)*1307comp_operator: "<" | ">" | "==" | ">=" | "<=" | "!="1308 | "is" ["not"] | ["not"] "in"1309```13101311Сравнения возвращают логические значения: `True` или `False`. Пользовательские *методы расширенного сравнения* могут возвращать не-логические значения. В этом случае Python вызовет [`bool()`](https://python-all.ru/3.15/library/functions.html#bool) для такого значения в логических контекстах.13121313Сравнения можно произвольно объединять в цепочки, например, `x < y <= z` эквивалентно `x < y and y <= z`, за исключением того, что `y` вычисляется только один раз (но в обоих случаях `z` вообще не вычисляется, если `x < y` оказывается ложным).13141315Формально, если *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`, за исключением того, что каждое выражение вычисляется не более одного раза.13161317Обратите внимание, что `a op1 b op2 c` не подразумевает никакого сравнения между *a* и *c*, так что, например, `x < y > z` совершенно допустимо (хотя, возможно, и некрасиво).13181319### 6.10.1. Сравнения значений13201321Операторы `<`, `>`, `==`, `>=`, `<=` и `!=` сравнивают значения двух объектов. Объекты не обязательно должны иметь одинаковый тип.13221323В главе [Объекты, значения и типы](https://python-all.ru/3.15/reference/datamodel.html#objects) говорится, что объекты имеют значение (в дополнение к типу и идентичности). Значение объекта – довольно абстрактное понятие в Python: например, не существует канонического метода доступа к значению объекта. Также не требуется, чтобы значение объекта было сформировано определённым образом, например, из всех его атрибутов данных. Операторы сравнения реализуют определённое представление о том, что является значением объекта. Можно считать, что они косвенно определяют значение объекта через свою реализацию сравнения.13241325Поскольку все типы являются (прямыми или косвенными) подтипами [`object`](https://python-all.ru/3.15/library/functions.html#object), они наследуют поведение сравнения по умолчанию от `object`. Типы могут настраивать своё поведение сравнения, реализуя *методы расширенного сравнения*, такие как [`__lt__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__lt__), описанные в разделе [Базовая настройка](https://python-all.ru/3.15/reference/datamodel.html#customization).13261327Поведение по умолчанию для сравнения на равенство (`==` и `!=`) основано на идентичности объектов. Следовательно, сравнение на равенство экземпляров с одинаковой идентичностью даёт равенство, а сравнение экземпляров с разной идентичностью – неравенство. Мотивация такого поведения по умолчанию – желание, чтобы все объекты были рефлексивными (т.е. `x is y` влечёт `x == y`).13281329Поведение сравнения порядка по умолчанию (`<`, `>`, `<=` и `>=`) не предусмотрено; попытка вызывает [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError). Мотивация такого поведения по умолчанию – отсутствие аналогичного инварианта, как для равенства.13301331Поведение сравнения на равенство по умолчанию, при котором экземпляры с разной идентичностью всегда неравны, может противоречить тому, что нужно типам, имеющим разумное определение значения объекта и равенства на основе значения. Таким типам потребуется настраивать своё поведение сравнения, и, в самом деле, ряд встроенных типов уже это сделал.13321333Следующий список описывает поведение сравнения наиболее важных встроенных типов.13341335- Числа встроенных числовых типов ([Числовые типы – int, float, complex](https://python-all.ru/3.15/library/stdtypes.html#typesnumeric)) и типов стандартной библиотеки [`fractions.Fraction`](https://python-all.ru/3.15/library/fractions.html#fractions.Fraction) и [`decimal.Decimal`](https://python-all.ru/3.15/library/decimal.html#decimal.Decimal) можно сравнивать как внутри своих типов, так и между ними, с ограничением, что комплексные числа не поддерживают сравнение порядка. В пределах задействованных типов они сравниваются математически (алгоритмически) корректно без потери точности.13361337 Значения «не число» (NaN) `float('NaN')` и `decimal.Decimal('NaN')` являются особыми. Любое упорядоченное сравнение числа со значением «не число» даёт ложь. Контринтуитивное следствие: значения «не число» не равны сами себе. Например, если `x = float('NaN')`, `3 < x`, `x < 3` и `x == x` – все ложны, а `x != x` истинно. Это поведение соответствует стандарту IEEE 754.1338- `None` и [`NotImplemented`](https://python-all.ru/3.15/library/constants.html#NotImplemented) – это синглтоны. [**PEP 8**](https://python-all.ru/3.15/reference/expressions.html) рекомендует всегда выполнять сравнения синглтонов с помощью `is` или `is not`, а не операторов равенства.1339- Бинарные последовательности (экземпляры [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes) или [`bytearray`](https://python-all.ru/3.15/library/stdtypes.html#bytearray)) можно сравнивать как внутри своих типов, так и между ними. Они сравниваются лексикографически по числовым значениям своих элементов.1340- Строки (экземпляры [`str`](https://python-all.ru/3.15/library/stdtypes.html#str)) сравниваются лексикографически по числовым кодовым точкам Unicode (результат встроенной функции [`ord()`](https://python-all.ru/3.15/library/functions.html#ord)) своих символов. [\[3\]](https://python-all.ru/3.15/reference/expressions.html#id24)13411342 Строки и двоичные последовательности нельзя сравнивать напрямую.1343- Последовательности (экземпляры [`tuple`](https://python-all.ru/3.15/library/stdtypes.html#tuple), [`list`](https://python-all.ru/3.15/library/stdtypes.html#list) или [`range`](https://python-all.ru/3.15/library/stdtypes.html#range)) можно сравнивать только внутри каждого из своих типов, с ограничением, что диапазоны не поддерживают сравнение порядка. Сравнение на равенство между этими типами даёт неравенство, а сравнение порядка между этими типами вызывает [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError).13441345 Последовательности сравниваются лексикографически с помощью сравнения соответствующих элементов. Встроенные контейнеры обычно считают, что одинаковые объекты равны сами себе. Это позволяет им пропускать проверки на равенство для одинаковых объектов для повышения производительности и поддержания внутренних инвариантов.13461347 Лексикографическое сравнение между встроенными коллекциями работает следующим образом:13481349 - Чтобы две коллекции были равны при сравнении, они должны быть одного типа, иметь одинаковую длину, и каждая пара соответствующих элементов должна быть равной (например, `[1,2] == (1,2)` – ложь, так как типы разные).1350 - Коллекции, поддерживающие сравнение порядка, упорядочиваются так же, как и их первые неравные элементы (например, `[1,2,x] <= [1,2,y]` имеет то же значение, что и `x <= y`). Если соответствующего элемента не существует, более короткая коллекция считается меньшей (например, `[1,2] < [1,2,3]` – истина).1351- Отображения (экземпляры [`dict`](https://python-all.ru/3.15/library/stdtypes.html#dict)) равны тогда и только тогда, когда они имеют равные пары `(key, value)`. Сравнение ключей и значений на равенство требует рефлексивности.13521353 Сравнения порядка (`<`, `>`, `<=` и `>=`) вызывают [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError).1354- Множества (экземпляры [`set`](https://python-all.ru/3.15/library/stdtypes.html#set) или [`frozenset`](https://python-all.ru/3.15/library/stdtypes.html#frozenset)) можно сравнивать как внутри типа, так и между типами.13551356 Они определяют операторы сравнения порядка как проверки на подмножество и надмножество. Эти отношения не задают полного порядка (например, два множества `{1,2}` и `{2,3}` не равны, не являются подмножеством друг друга и не являются надмножеством друг друга). Соответственно, множества не подходят в качестве аргументов для функций, зависящих от полного порядка (например, [`min()`](https://python-all.ru/3.15/library/functions.html#min), [`max()`](https://python-all.ru/3.15/library/functions.html#max) и [`sorted()`](https://python-all.ru/3.15/library/functions.html#sorted) дают неопределённые результаты, если на вход подаётся список множеств).13571358 Сравнение множеств требует рефлексивности их элементов.1359- У большинства других встроенных типов нет реализованных методов сравнения, поэтому они наследуют поведение сравнения по умолчанию.13601361Пользовательские классы, которые настраивают своё поведение сравнения, должны по возможности следовать некоторым правилам согласованности:13621363- Сравнение на равенство должно быть рефлексивным. Другими словами, идентичные объекты должны быть равны:13641365 > `x is y` влечёт `x == y`1366- Сравнение должно быть симметричным. Другими словами, следующие выражения должны давать одинаковый результат:13671368 > `x == y` и `y == x`1369 >1370 > `x != y` и `y != x`1371 >1372 > `x < y` и `y > x`1373 >1374 > `x <= y` и `y >= x`1375- Сравнение должно быть транзитивным. Следующие (неисчерпывающие) примеры это иллюстрируют:13761377 > `x > y and y > z` влечёт `x > z`1378 >1379 > `x < y and y <= z` влечёт `x < z`1380- Обратное сравнение должно давать логическое отрицание. Другими словами, следующие выражения должны давать одинаковый результат:13811382 > `x == y` и `not x != y`1383 >1384 > `x < y` и `not x >= y` (для полного порядка)1385 >1386 > `x > y` и `not x <= y` (для полного порядка)13871388 Последние два выражения применимы к полностью упорядоченным коллекциям (например, к последовательностям, но не к множествам или отображениям). См. также декоратор [`total_ordering()`](https://python-all.ru/3.15/library/functools.html#functools.total_ordering).1389- Результат [`hash()`](https://python-all.ru/3.15/library/functions.html#hash) должен быть согласован с равенством. Объекты, которые равны, должны либо иметь одинаковое хеш-значение, либо быть помечены как нехешируемые.13901391Python не требует соблюдения этих правил согласованности. Фактически, значения «не число» (NaN) являются примером их нарушения.13921393### 6.10.2. Операции проверки принадлежности13941395Операторы [`in`](https://python-all.ru/3.15/reference/expressions.html#in) и [`not in`](https://python-all.ru/3.15/reference/expressions.html#not-in) проверяют принадлежность. `x in s` вычисляется в `True`, если *x* является элементом *s*, и `False` в противном случае. `x not in s` возвращает отрицание `x in s`. Все встроенные последовательности и множества поддерживают это, а также словари, для которых `in` проверяет, содержит ли словарь заданный ключ. Для контейнерных типов, таких как list, tuple, set, frozenset, dict или collections.deque, выражение `x in y` эквивалентно `any(x is e or x == e for e in y)`.13961397Для типов str и bytes `x in y` равно `True` тогда и только тогда, когда *x* является подстрокой *y*. Эквивалентная проверка: `y.find(x) != -1`. Пустые строки всегда считаются подстрокой любой другой строки, поэтому `"" in "abc"` вернёт `True`.13981399Для пользовательских классов, которые определяют метод [`__contains__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__contains__), `x in y` возвращает `True`, если `y.__contains__(x)` возвращает истинное значение, и `False` в противном случае.14001401Для пользовательских классов, которые не определяют [`__contains__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__contains__), но определяют [`__iter__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__iter__), `x in y` равно `True`, если при итерации по `y` встречается некоторое значение `z`, для которого выражение `x is z or x == z` истинно. Если во время итерации возникает исключение, это равносильно тому, что [`in`](https://python-all.ru/3.15/reference/expressions.html#in) вызвало это исключение.14021403Наконец, используется протокол итерации старого стиля: если класс определяет [`__getitem__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__getitem__), `x in y` равно `True` тогда и только тогда, когда существует неотрицательный целочисленный индекс *i*, такой что `x is y[i] or x == y[i]`, и ни один меньший индекс не вызывает исключение [`IndexError`](https://python-all.ru/3.15/library/exceptions.html#IndexError). (Если возникает любое другое исключение, это равносильно тому, что [`in`](https://python-all.ru/3.15/reference/expressions.html#in) вызвало это исключение).14041405Оператор [`not in`](https://python-all.ru/3.15/reference/expressions.html#not-in) определён так, что его истинностное значение противоположно [`in`](https://python-all.ru/3.15/reference/expressions.html#in).14061407### 6.10.3. Сравнение идентичности14081409Операторы [`is`](https://python-all.ru/3.15/reference/expressions.html#is) и [`is not`](https://python-all.ru/3.15/reference/expressions.html#is-not) проверяют идентичность объектов: `x is y` истинно тогда и только тогда, когда *x* и *y* являются одним и тем же объектом. Идентичность объекта определяется с помощью функции [`id()`](https://python-all.ru/3.15/library/functions.html#id). `x is not y` возвращает противоположное логическое значение. [\[4\]](https://python-all.ru/3.15/reference/expressions.html#id25)14101411## 6.11. Логические операции14121413```14141415or_test: and_test | or_test "or" and_test1416and_test: not_test | and_test "and" not_test1417not_test: comparison | "not" not_test1418```14191420В контексте логических операций, а также когда выражения используются в операторах управления потоком, следующие значения интерпретируются как ложные: `False`, `None`, числовой ноль всех типов, а также пустые строки и контейнеры (включая строки, кортежи, списки, словари, множества и неизменяемые множества). Все остальные значения интерпретируются как истинные. Пользовательские объекты могут настраивать своё логическое значение, предоставив метод [`__bool__()`](https://python-all.ru/3.15/reference/datamodel.html#object.__bool__).14211422Оператор [`not`](https://python-all.ru/3.15/reference/expressions.html#not) возвращает `True`, если его аргумент ложен, и `False` в противном случае.14231424Выражение `x and y` сначала вычисляет *x*; если *x* ложно, возвращается его значение; в противном случае вычисляется *y* и возвращается полученное значение.14251426Выражение `x or y` сначала вычисляет *x*; если *x* истинно, возвращается его значение; в противном случае вычисляется *y* и возвращается полученное значение.14271428Обратите внимание, что ни [`and`](https://python-all.ru/3.15/reference/expressions.html#and), ни [`or`](https://python-all.ru/3.15/reference/expressions.html#or) не ограничивают возвращаемое значение и тип до `False` и `True`, а возвращают последний вычисленный аргумент. Это иногда бывает полезно, например, если `s` – строка, которую нужно заменить значением по умолчанию, если она пуста, выражение `s or 'foo'` даёт нужное значение. Поскольку [`not`](https://python-all.ru/3.15/reference/expressions.html#not) должен создать новое значение, он возвращает логическое значение независимо от типа своего аргумента (например, `not 'foo'` даёт `False`, а не `''`).14291430## 6.12. Выражения присваивания14311432```14331434assignment_expression: [identifier ":="] expression1435```14361437Выражение присваивания (иногда также называемое «именованным выражением» или «моржом») присваивает [`expression`](https://python-all.ru/3.15/reference/expressions.html#grammar-token-python-grammar-expression) [`identifier`](https://python-all.ru/3.15/reference/lexical_analysis.html#grammar-token-python-grammar-identifier), одновременно возвращая значение `expression`.14381439Один из распространённых случаев использования – при обработке совпавших регулярных выражений:14401441```python1442if matching := pattern.search(data):1443 do_something(matching)1444```14451446Или при обработке файлового потока по частям:14471448```python1449while chunk := file.read(9000):1450 process(chunk)1451```14521453Выражения присваивания должны быть заключены в круглые скобки, если они используются как выражения-инструкции, а также как подвыражения в срезах, условных выражениях, лямбда-выражениях, выражениях с именованными аргументами и в условиях генераторов списков, а также в инструкциях `assert`, `with` и `assignment`. Во всех остальных местах, где они допустимы, скобки не требуются, в том числе в инструкциях `if` и `while`.14541455Добавлено в версии 3.8: См. [**PEP 572**](https://python-all.ru/3.15/reference/expressions.html) для получения дополнительных сведений о выражениях присваивания.14561457## 6.13. Условные выражения14581459```14601461conditional_expression: or_test ["if" or_test "else" expression]1462expression: conditional_expression | lambda_expr1463```14641465Условное выражение (иногда называемое «тернарным оператором») является альтернативой инструкции if-else. Поскольку это выражение, оно возвращает значение и может использоваться как подвыражение.14661467Выражение `x if C else y` сначала вычисляет условие *C*, а не *x*. Если *C* истинно, вычисляется *x* и возвращается его значение; в противном случае вычисляется *y* и возвращается его значение.14681469См. [**PEP 308**](https://python-all.ru/3.15/reference/expressions.html) для получения дополнительных сведений об условных выражениях.14701471## 6.14. Лямбда-выражения14721473```14741475lambda_expr: "lambda" [parameter_list] ":" expression1476```14771478Лямбда-выражения (иногда называемые лямбда-формами) используются для создания анонимных функций. Выражение `lambda parameters: expression` возвращает объект функции. Этот безымянный объект ведёт себя как объект функции, определённый с помощью:14791480```text1481def <lambda>(parameters):1482 return expression1483```14841485См. раздел [Определения функций](https://python-all.ru/3.15/reference/compound_stmts.html#function) о синтаксисе списков параметров. Обратите внимание, что функции, созданные с помощью лямбда-выражений, не могут содержать инструкции или аннотации.14861487## 6.15. Списки выражений14881489```14901491starred_expression: "*" or_expr | expression1492flexible_expression: assignment_expression | starred_expression1493flexible_expression_list: flexible_expression ("," flexible_expression)* [","]1494starred_expression_list: starred_expression ("," starred_expression)* [","]1495expression_list: expression ("," expression)* [","]1496yield_list: expression_list | starred_expression "," [starred_expression_list]1497```14981499За исключением случаев, когда список выражений является частью литерала списка или множества, список выражений, содержащий хотя бы одну запятую, образует кортеж. Длина кортежа равна количеству выражений в списке. Выражения вычисляются слева направо.15001501Завершающая запятая требуется только для создания кортежа из одного элемента, например `1,`; во всех остальных случаях она необязательна. Одиночное выражение без завершающей запятой не создаёт кортеж, а возвращает значение этого выражения. (Чтобы создать пустой кортеж, используйте пустую пару круглых скобок: `()`.)15021503### 6.15.1. Распаковка итерируемых объектов15041505В списке выражений, а также в отображении кортежа, списка или множества любое выражение может быть помечено звёздочкой (`*`). Это обозначает *распаковку итерируемого объекта*.15061507Во время выполнения выражение со звёздочкой должно вычисляться в [итерируемый объект](https://python-all.ru/3.15/glossary.html#term-iterable). Итерируемый объект разворачивается в последовательность элементов, которые включаются в новый кортеж, список или множество на месте распаковки.15081509Добавлено в версии 3.5: Распаковка итерируемых объектов в списках выражений, изначально предложенная в [**PEP 448**](https://python-all.ru/3.15/reference/expressions.html).15101511Добавлено в версии 3.11: Любой элемент в списке выражений может быть помечен звёздочкой. См. [**PEP 646**](https://python-all.ru/3.15/reference/expressions.html).15121513## 6.16. Порядок вычисления15141515Python вычисляет выражения слева направо. Обратите внимание, что при вычислении присваивания сначала вычисляется правая часть, а затем левая.15161517В следующих строках выражения будут вычисляться в арифметическом порядке их суффиксов:15181519```python1520expr1, expr2, expr3, expr41521(expr1, expr2, expr3, expr4)1522{expr1: expr2, expr3: expr4}1523expr1 + expr2 * (expr3 - expr4)1524expr1(expr2, expr3, *expr4, **expr5)1525expr3, expr4 = expr1, expr21526```15271528## 6.17. Приоритет операторов15291530В следующей таблице представлен приоритет операторов в Python, от наивысшего приоритета (самая сильная связь) до наименьшего (самая слабая связь). Операторы в одной ячейке имеют одинаковый приоритет. Если синтаксис не указан явно, операторы являются бинарными. Операторы в одной ячейке группируются слева направо (за исключением возведения в степень и условных выражений, которые группируются справа налево).15311532Сравнения, проверки принадлежности и проверки тождественности имеют одинаковый приоритет и связываются слева направо, как описано в разделе [Сравнения](https://python-all.ru/3.15/reference/expressions.html#comparisons).15331534| Оператор | Описание |1535| --- | --- |1536| `(expressions...)`, `[expressions...]`, `{key: value...}`, `{expressions...}` | Связывание или выражение в скобках, список, словарь, множество |1537| `x[index]`, `x[index:index]` `x(arguments...)`, `x.attribute` | Индексация (включая срезы), вызов, ссылка на атрибут |1538| [`await x`](https://python-all.ru/3.15/reference/expressions.html#await) | Выражение await |1539| `**` | Возведение в степень [\[5\]](https://python-all.ru/3.15/reference/expressions.html#id26) |1540| `+x`, `-x`, `~x` | Унарный плюс, унарный минус, побитовое НЕ |1541| `*`, `@`, `/`, `//`, `%` | Умножение, матричное умножение, деление, целочисленное деление, остаток [\[6\]](https://python-all.ru/3.15/reference/expressions.html#id27) |1542| `+`, `-` | Сложение и вычитание |1543| `<<`, `>>` | Сдвиги |1544| `&` | Побитовое И |1545| `^` | Побитовое исключающее ИЛИ |1546| `\|` | Побитовое ИЛИ |1547| [`in`](https://python-all.ru/3.15/reference/expressions.html#in), [`not in`](https://python-all.ru/3.15/reference/expressions.html#not-in), [`is`](https://python-all.ru/3.15/reference/expressions.html#is), [`is not`](https://python-all.ru/3.15/reference/expressions.html#is-not), `<`, `<=`, `>`, `>=`, `!=`, `==` | Сравнения, включая проверки принадлежности и тождественности |1548| [`not x`](https://python-all.ru/3.15/reference/expressions.html#not) | Логическое НЕ |1549| [`and`](https://python-all.ru/3.15/reference/expressions.html#and) | Логическое И |1550| [`or`](https://python-all.ru/3.15/reference/expressions.html#or) | Логическое ИЛИ |1551| [`if`](https://python-all.ru/3.15/reference/expressions.html#if-expr) – `else` | Условное выражение |1552| [`lambda`](https://python-all.ru/3.15/reference/expressions.html#lambda) | Лямбда-выражение |1553| `:=` | Выражение присваивания |15541555Сноски15561557\[[1](https://python-all.ru/3.15/reference/expressions.html#id11)\]15581559Хотя математически `abs(x%y) < abs(y)` истинно, для чисел с плавающей запятой оно может не выполняться численно из-за округления. Например, если предположить платформу, на которой число с плавающей запятой Python является числом двойной точности IEEE 754, то чтобы `-1e-100 % 1e100` имело тот же знак, что и `1e100`, вычисленный результат равен `-1e-100 + 1e100`, что численно в точности равно `1e100`. Функция [`math.fmod()`](https://python-all.ru/3.15/library/math.html#math.fmod) вместо этого возвращает результат, знак которого совпадает со знаком первого аргумента, поэтому в данном случае возвращает `-1e-100`. Какой подход более уместен, зависит от приложения.15601561\[[2](https://python-all.ru/3.15/reference/expressions.html#id12)\]15621563Если x очень близок к целому кратному y, возможно, что `x//y` будет на единицу больше `(x-x%y)//y` из-за округления. В таких случаях Python возвращает последний результат, чтобы `divmod(x,y)[0] * y + x % y` оставался очень близким к `x`.15641565\[[3](https://python-all.ru/3.15/reference/expressions.html#id14)\]15661567Стандарт 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).15681569Операторы сравнения строк сравнивают на уровне кодовых точек Unicode. Это может быть неинтуитивно для человека. Например, `"\u00C7" == "\u0043\u0327"` равно `False`, хотя обе строки представляют один и тот же абстрактный символ «LATIN CAPITAL LETTER C WITH CEDILLA».15701571Для сравнения строк на уровне абстрактных символов (то есть интуитивно понятным способом) используется [`unicodedata.normalize()`](https://python-all.ru/3.15/library/unicodedata.html#unicodedata.normalize).15721573\[[4](https://python-all.ru/3.15/reference/expressions.html#id15)\]15741575Из-за автоматической сборки мусора, списков свободных объектов и динамической природы дескрипторов может наблюдаться, казалось бы, необычное поведение при определённых использованиях оператора [`is`](https://python-all.ru/3.15/reference/expressions.html#is), например, при сравнениях между методами экземпляров или константами. За дополнительной информацией обратитесь к их документации.15761577\[[5](https://python-all.ru/3.15/reference/expressions.html#id20)\]15781579Оператор возведения в степень `**` связывает менее тесно, чем арифметический или побитовый унарный оператор справа от него, то есть `2**-1` равно `0.5`.15801581\[[6](https://python-all.ru/3.15/reference/expressions.html#id21)\]15821583Оператор `%` также используется для форматирования строк; для него действует тот же приоритет.1584