Документация Python неофициальный перевод

expressions.md

688 строк · 80.1 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.0/reference/expressions.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Выражения89В этой главе объясняется значение элементов выражений в Python.1011**Примечания к синтаксису:** В этой и следующих главах для описания синтаксиса, а не лексического анализа, будет использоваться расширенная нотация БНФ. Когда (одна из альтернатив) синтаксического правила имеет вид1213```1415name ::=  othername16```1718и если семантика не указана, то семантика такой формы `name` такая же, как для `othername`.1920## Арифметические преобразования2122Когда в описании арифметического оператора ниже используется фраза «числовые аргументы преобразуются к общему типу», это означает, что реализация оператора для встроенных типов работает следующим образом:2324- Если хотя бы один аргумент – комплексное число, другой преобразуется в комплексное;25- в противном случае, если хотя бы один аргумент является числом с плавающей запятой, другой преобразуется в число с плавающей запятой;26- в противном случае оба должны быть целыми числами, и преобразование не требуется.2728Для некоторых операторов действуют дополнительные правила (например, строковый левый аргумент для оператора «%»). Расширения должны определять собственное поведение преобразования.2930## Атомы3132Атомы – это самые базовые элементы выражений. Простейшие атомы – идентификаторы или литералы. Формы, заключённые в круглые, квадратные или фигурные скобки, также синтаксически относятся к атомам. Синтаксис атомов:3334```3536atom      ::=  identifier | literal | enclosure37enclosure ::=  parenth_form | list_display | dict_display | set_display38               | generator_expression | yield_atom39```4041### Идентификаторы (имена)4243Идентификатор, выступающий в роли атома, является именем. См. раздел [*Идентификаторы и ключевые слова*](https://python-all.ru/3.0/reference/lexical_analysis.html#identifiers) для лексического определения и раздел [*Именование и связывание*](https://python-all.ru/3.0/reference/executionmodel.html#naming) для документации по именованию и связыванию.4445Когда имя привязано к объекту, вычисление атома возвращает этот объект. Когда имя не привязано, попытка его вычисления вызывает исключение [`NameError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.NameError).4647**Искажение закрытых имён:** Когда идентификатор, текстуально встречающийся в определении класса, начинается с двух или более символов подчёркивания и не заканчивается двумя или более подчёркиваниями, он считается *закрытым именем* этого класса. Закрытые имена преобразуются в более длинную форму перед генерацией кода для них. Преобразование вставляет имя класса перед именем, удаляя ведущие подчёркивания, и вставляет одно подчёркивание перед именем класса. Например, идентификатор `__spam`, встречающийся в классе с именем `Ham`, будет преобразован в `_Ham__spam`. Это преобразование не зависит от синтаксического контекста, в котором используется идентификатор. Если преобразованное имя слишком длинное (длиннее 255 символов), может произойти усечение, определяемое реализацией. Если имя класса состоит только из подчёркиваний, преобразование не выполняется.4849### Литералы5051Python поддерживает строковые литералы, литералы bytes и различные числовые литералы:5253```5455literal ::=  stringliteral | bytesliteral56             | integer | floatnumber | imagnumber57```5859Вычисление литерала даёт объект указанного типа (строка, bytes, целое число, число с плавающей запятой, комплексное число) с указанным значением. Значение может быть приближённым для литералов с плавающей запятой и мнимых (комплексных). Подробнее см. раздел [*Литералы*](https://python-all.ru/3.0/reference/lexical_analysis.html#literals).6061За исключением литералов bytes, все они соответствуют неизменяемым типам данных, и поэтому идентичность объекта менее важна, чем его значение. Многократное вычисление литералов с одним и тем же значением (как в одном месте текста программы, так и в разных) может дать как один и тот же объект, так и разные объекты с одинаковым значением.6263### Формы в скобках6465Выражение в скобках – это необязательный список выражений, заключённый в круглые скобки:6667```6869parenth_form ::=  "(" [expression_list] ")"70```7172Вычисление списка выражений в скобках даёт результат этого списка: если список содержит хотя бы одну запятую, получается кортеж; в противном случае – единственное выражение, из которого состоит список.7374Пустая пара круглых скобок создаёт пустой объект кортежа. Поскольку кортежи неизменяемы, применяются правила для литералов (т.е. два вхождения пустого кортежа могут давать один и тот же объект или нет).7576Обратите внимание, что кортежи образуются не круглыми скобками, а использованием оператора запятой. Исключением является пустой кортеж, для которого круглые скобки *требуются* – разрешение «ничего» без скобок в выражениях привело бы к неоднозначностям и позволило бы распространённым опечаткам остаться незамеченными.7778### Отображения для списков, множеств и словарей7980Для создания списка, множества или словаря в Python предусмотрен специальный синтаксис, называемый «отображениями» (displays); каждый из них существует в двух вариантах:8182- либо содержимое контейнера перечисляется явно, либо83- они вычисляются с помощью набора инструкций циклов и фильтрации, называемого *включением (comprehension)*.8485Общие синтаксические элементы для включений:8687```8889comprehension ::=  expression comp_for90comp_for      ::=  "for" target_list "in" or_test [comp_iter]91comp_iter     ::=  comp_for | comp_if92comp_if       ::=  "if" expression_nocond [comp_iter]93```9495Генератор коллекции состоит из одного выражения, за которым следует как минимум одно предложение [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) и ноль или более предложений [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) или [`if`](https://python-all.ru/3.0/reference/compound_stmts.html#if). В этом случае элементами нового контейнера будут те, которые получаются при рассмотрении каждого из предложений [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) или [`if`](https://python-all.ru/3.0/reference/compound_stmts.html#if) как блока, вложенных слева направо, и вычислении выражения для получения элемента каждый раз, когда достигается самый внутренний блок.9697Обратите внимание, что включение выполняется в отдельной области видимости, так что имена, присвоенные в списке целей, не «просачиваются» в окружающую область.9899### Отображения списков100101Списковое отображение – это возможно пустая последовательность выражений, заключённая в квадратные скобки:102103```104105list_display ::=  "[" [expression_list | comprehension] "]"106```107108Списковое отображение возвращает новый объект списка, содержимое которого задаётся либо списком выражений, либо включением. Если предоставлен разделённый запятыми список выражений, его элементы вычисляются слева направо и помещаются в объект списка в том же порядке. Если предоставлено включение, список строится из элементов, полученных в результате включения.109110### Отображения множеств111112Множественное отображение обозначается фигурными скобками и отличается от словарных отображений отсутствием двоеточий, разделяющих ключи и значения:113114```115116set_display ::=  "{" (expression_list | comprehension) "}"117```118119Множественное отображение возвращает новый изменяемый объект множества, содержимое которого задаётся либо последовательностью выражений, либо включением. Если предоставлен разделённый запятыми список выражений, его элементы вычисляются слева направо и добавляются в объект множества. Если предоставлено включение, множество строится из элементов, полученных в результате включения.120121Пустое множество нельзя создать с помощью `{}`; этот литерал создаёт пустой словарь.122123### Отображения словарей124125Отображение словаря – это возможно пустая последовательность пар ключ/значение, заключённая в фигурные скобки:126127```128129dict_display       ::=  "{" [key_datum_list | dict_comprehension] "}"130key_datum_list     ::=  key_datum ("," key_datum)* [","]131key_datum          ::=  expression ":" expression132dict_comprehension ::=  expression ":" expression comp_for133```134135Словарное отображение возвращает новый объект словаря.136137Если задана разделённая запятыми последовательность пар ключ/значение, они вычисляются слева направо для определения записей словаря: каждый объект ключа используется как ключ в словаре для хранения соответствующего значения. Это означает, что можно указать один и тот же ключ несколько раз в списке ключ/значение, и итоговое значение словаря для этого ключа будет последним указанным.138139Словарное включение, в отличие от списковых и множественных включений, требует двух выражений, разделённых двоеточием, после которых следуют обычные предложения «for» и «if». При выполнении включения результирующие элементы ключей и значений вставляются в новый словарь в порядке их получения.140141Ограничения на типы ключей перечислены ранее в разделе [*Стандартная иерархия типов*](https://python-all.ru/3.0/reference/datamodel.html#types). (Кратко: тип ключа должен быть [*хешируемым*](https://python-all.ru/3.0/glossary.html#term-hashable), что исключает все изменяемые объекты.) Конфликты между дублирующимися ключами не обнаруживаются; последнее значение (текстуально самое правое в отображении), сохранённое для данного ключа, побеждает.142143### Выражения-генераторы144145Генераторное выражение – это компактная запись генератора в круглых скобках:146147```148149generator_expression ::=  "(" expression comp_for ")"150```151152Генераторное выражение возвращает новый объект-генератор. Его синтаксис такой же, как у включений, за исключением того, что оно заключается в круглые скобки вместо квадратных или фигурных.153154Переменные, используемые в генераторном выражении, вычисляются лениво при вызове метода `__next__()` для объекта-генератора (так же, как в обычных генераторах). Однако левое [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) предложение вычисляется сразу, чтобы ошибку, возникшую в нём, можно было увидеть до любых других возможных ошибок в коде, обрабатывающем генераторное выражение. Последующие предложения [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) не могут быть вычислены немедленно, так как могут зависеть от предыдущего цикла [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for). Например: `(x*y for x in range(10) for y in bar(x))`.155156Круглые скобки можно опускать при вызовах с единственным аргументом. Подробнее см. раздел [*Calls*](https://python-all.ru/3.0/reference/expressions.html#calls).157158### Выражения yield159160```161162yield_atom       ::=  "(" yield_expression ")"163yield_expression ::=  "yield" [expression_list]164```165166Выражение [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) используется только при определении функции-генератора и может использоваться только в теле определения функции. Использование выражения [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) в определении функции достаточно, чтобы это определение создавало функцию-генератор вместо обычной функции.167168Когда вызывается генераторная функция, она возвращает итератор, называемый генератором. Этот генератор затем управляет выполнением генераторной функции. Выполнение начинается, когда вызывается один из методов генератора. В этот момент выполнение доходит до первого выражения [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield), где оно снова приостанавливается, возвращая значение [**expression\_list**](https://python-all.ru/3.0/reference/expressions.html#grammar-token-expression_list) вызывающему коду генератора. Под «приостановлено» подразумевается, что всё локальное состояние сохраняется, включая текущие привязки локальных переменных, указатель инструкций и внутренний стек вычислений. Когда выполнение возобновляется вызовом одного из методов генератора, функция продолжается так, как если бы выражение [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) было просто ещё одним внешним вызовом. Значение выражения [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) после возобновления зависит от метода, который возобновил выполнение.169170Всё это делает генераторные функции очень похожими на корутины: они могут порождать значения (yield) несколько раз, имеют несколько точек входа, и их выполнение может быть приостановлено. Единственное отличие в том, что генераторная функция не может управлять тем, куда перейдёт выполнение после yield; управление всегда передаётся вызывающему коду генератора.171172Инструкция [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) разрешена в блоке [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) конструкции [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) ... [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally). Если генератор не будет возобновлён до его финализации (достижение нулевого счётчика ссылок или сборка мусора), будет вызван метод `close()` итератора генератора, что позволит выполнить незавершённые блоки [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally).173174Следующие методы генератора используются для управления выполнением генераторной функции:175176#### `[generator.__next__]generator.__next__()`177178Начинает выполнение генераторной функции или возобновляет его с последнего выполненного выражения [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield). Когда генераторная функция возобновляется вызовом метода `__next__()`, текущее выражение [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield) всегда вычисляется в [`None`](https://python-all.ru/3.0/library/constants.html#None). Затем выполнение переходит к следующему выражению [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield), где генератор снова приостанавливается, и значение [**expression\_list**](https://python-all.ru/3.0/reference/expressions.html#grammar-token-expression_list) возвращается вызывающему коду [`next()`](https://python-all.ru/3.0/library/functions.html#next). Если генератор завершается, не породив ещё одного значения, возбуждается исключение [`StopIteration`](https://python-all.ru/3.0/library/exceptions.html#exceptions.StopIteration).179180Обычно этот метод вызывается неявно, например, циклом [`for`](https://python-all.ru/3.0/reference/compound_stmts.html#for) или встроенной функцией [`next()`](https://python-all.ru/3.0/library/functions.html#next).181182#### `[generator.send]generator.send(value)`183184Возобновляет выполнение и «передаёт» значение в генераторную функцию. Аргумент185186`value`187188становится результатом текущего выражения189190[`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield)191192. Метод193194`send()`195196возвращает следующее значение, порождённое генератором, или возбуждает исключение197198[`StopIteration`](https://python-all.ru/3.0/library/exceptions.html#exceptions.StopIteration)199200, если генератор завершается, не породив нового значения. Когда201202`send()`203204вызывается для запуска генератора, он должен быть вызван с205206[`None`](https://python-all.ru/3.0/library/constants.html#None)207208в качестве аргумента, потому что нет выражения209210[`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield)211212, которое могло бы принять значение.213214#### `[generator.throw]generator.throw(type[, value[, traceback]])`215216Возбуждает исключение типа217218`type`219220в точке, где был приостановлен генератор, и возвращает следующее значение, порождённое функцией-генератором. Если генератор завершается, не породив другое значение, возбуждается исключение221222[`StopIteration`](https://python-all.ru/3.0/library/exceptions.html#exceptions.StopIteration)223224. Если функция-генератор не перехватывает переданное исключение или возбуждает другое исключение, то это исключение распространяется к вызывающей стороне.225226#### `[generator.close]generator.close()`227228Возбуждает229230[`GeneratorExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.GeneratorExit)231232в точке, где генераторная функция была приостановлена. Если генераторная функция затем возбуждает233234[`StopIteration`](https://python-all.ru/3.0/library/exceptions.html#exceptions.StopIteration)235236(завершаясь нормально или из-за того, что уже была закрыта) или237238[`GeneratorExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.GeneratorExit)239240(не перехватив исключение), close возвращает управление вызывающему коду. Если генератор порождает значение, возбуждается241242[`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError)243244. Если генератор возбуждает любое другое исключение, оно передаётся вызывающему коду.245246`close()`247248ничего не делает, если генератор уже завершился из-за исключения или нормального выхода.249250Вот простой пример, демонстрирующий поведение генераторов и генераторных функций:251252```python253>>> def echo(value=None):254...     print("Execution starts when 'next()' is called for the first time.")255...     try:256...         while True:257...             try:258...                 value = (yield value)259...             except Exception, e:260...                 value = e261...     finally:262...         print("Don't forget to clean up when 'close()' is called.")263...264>>> generator = echo(1)265>>> print(next(generator))266Execution starts when 'next()' is called for the first time.2671268>>> print(next(generator))269None270>>> print(generator.send(2))2712272>>> generator.throw(TypeError, "spam")273TypeError('spam',)274>>> generator.close()275Don't forget to clean up when 'close()' is called.276```277278> **См. также**279>280> **[**PEP 0255**](https://python-all.ru/3.0/reference/expressions.html) – Простые генераторы**281>282> Предложение о добавлении генераторов и оператора283>284> [`yield`](https://python-all.ru/3.0/reference/simple_stmts.html#yield)285>286> в Python.287>288> **[**PEP 0342**](https://python-all.ru/3.0/reference/expressions.html) – Корутины через расширенные генераторы**289>290> Предложение по улучшению API и синтаксиса генераторов, позволяющее использовать их как простые корутины.291292## Первичные выражения293294Первичные выражения представляют операции с самой высокой связностью в языке. Их синтаксис:295296```297298primary ::=  atom | attributeref | subscription | slicing | call299```300301### Ссылки на атрибуты302303Ссылка на атрибут – это первичное выражение, за которым следуют точка и имя:304305```306307attributeref ::=  primary "." identifier308```309310Первичное выражение должно вычисляться в объект типа, поддерживающего ссылки на атрибуты, что верно для большинства объектов. Затем этот объект запрашивается для получения атрибута, имя которого является идентификатором (поведение можно настроить, переопределив метод [`__getattr__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getattr__)). Если такой атрибут недоступен, возбуждается исключение [`AttributeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.AttributeError). В противном случае тип и значение полученного объекта определяются самим объектом. Многократные вычисления одной и той же ссылки на атрибут могут давать разные объекты.311312### Индексация313314Индексация выбирает элемент последовательности (строки, кортежа или списка) или отображения (словаря):315316```317318subscription ::=  primary "[" expression_list "]"319```320321Первичное выражение должно вычисляться в объект, поддерживающий индексацию, например, список или словарь. Пользовательские объекты могут поддерживать индексацию, определив метод [`__getitem__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getitem__).322323Для встроенных объектов существует два типа объектов, поддерживающих индексацию:324325Если первичное выражение является отображением, список выражений должен вычисляться в объект, значение которого является одним из ключей отображения, и индексация выбирает значение в отображении, соответствующее этому ключу. (Список выражений представляет собой кортеж, за исключением случая, когда он содержит ровно один элемент.)326327Если первичное выражение – последовательность, выражение (список) должно вычисляться в целое число. Если это значение отрицательно, к нему прибавляется длина последовательности (так, например, `x[-1]` выбирает последний элемент `x`). Полученное значение должно быть неотрицательным целым, меньшим количества элементов в последовательности, и операция индексации выбирает элемент, чей индекс равен этому значению (счёт с нуля).328329Элементами строки являются символы. Символ не является отдельным типом данных, а представляет собой строку ровно из одного символа.330331### Срезы332333Срез выбирает диапазон элементов в объекте последовательности (например, строке, кортеже или списке). Срезы могут использоваться как выражения или как цели в операторах присваивания или [`del`](https://python-all.ru/3.0/reference/simple_stmts.html#del). Синтаксис среза:334335```336337slicing      ::=  primary "[" slice_list "]"338slice_list   ::=  slice_item ("," slice_item)* [","]339slice_item   ::=  expression | proper_slice340proper_slice ::=  [lower_bound] ":" [upper_bound] [ ":" [stride] ]341lower_bound  ::=  expression342upper_bound  ::=  expression343stride       ::=  expression344```345346В формальном синтаксисе здесь есть неоднозначность: всё, что выглядит как список выражений, также выглядит как список срезов, поэтому любую индексацию можно интерпретировать как срез. Чтобы не усложнять синтаксис, эта неоднозначность разрешается тем, что в данном случае интерпретация как индексация имеет приоритет над интерпретацией как срез (это верно, если список срезов не содержит полноценного среза).347348Семантика среза следующая. Первичное выражение должно вычисляться в объект отображения, и оно индексируется (с помощью того же метода [`__getitem__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getitem__), что и обычная индексация) ключом, который строится из списка срезов, как описано ниже. Если список срезов содержит хотя бы одну запятую, ключом является кортеж, содержащий преобразование элементов среза; в противном случае ключом является преобразование единственного элемента среза. Преобразование элемента среза, являющегося выражением, есть само это выражение. Преобразование полноценного среза представляет собой объект среза (см. раздел [*Стандартная иерархия типов*](https://python-all.ru/3.0/reference/datamodel.html#types)), атрибуты `start`, `stop` и `step` которого являются значениями выражений, заданных как нижняя граница, верхняя граница и шаг соответственно, с заменой `None` для отсутствующих выражений.349350### Вызовы351352Вызов вызывает вызываемый объект (например, функцию) с возможно пустым набором аргументов:353354```355356call                 ::=  primary "(" [argument_list [","] | comprehension] ")"357argument_list        ::=  positional_arguments ["," keyword_arguments]358                            ["," "*" expression] ["," keyword_arguments]359                            ["," "**" expression]360                          | keyword_arguments ["," "*" expression]361                            ["," keyword_arguments] ["," "**" expression]362                          | "*" expression ["," keyword_arguments] ["," "**" expression]363                          | "**" expression364positional_arguments ::=  expression ("," expression)*365keyword_arguments    ::=  keyword_item ("," keyword_item)*366keyword_item         ::=  identifier "=" expression367```368369Замыкающая запятая может присутствовать после позиционных и именованных аргументов, но не влияет на семантику.370371Первичное выражение должно вычисляться в вызываемый объект (вызываемыми являются определённые пользователем функции, встроенные функции, методы встроенных объектов, объекты классов, методы экземпляров классов и все объекты, имеющие метод [`__call__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__call__)). Все выражения аргументов вычисляются до попытки вызова. Обратитесь к разделу [*Function definitions*](https://python-all.ru/3.0/reference/compound_stmts.html#function) за синтаксисом формальных списков параметров.372373При наличии именованных аргументов они сначала преобразуются в позиционные следующим образом. Сначала создаётся список незаполненных слотов для формальных параметров. Если есть N позиционных аргументов, они помещаются в первые N слотов. Затем для каждого именованного аргумента по его идентификатору определяется соответствующий слот (если идентификатор совпадает с именем первого формального параметра, используется первый слот и т.д.). Если слот уже заполнен, вызывается исключение [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError). В противном случае значение аргумента помещается в слот, заполняя его (даже если выражение равно `None`, оно всё равно заполняет слот). Когда все аргументы обработаны, оставшиеся незаполненными слоты заполняются соответствующими значениями по умолчанию из определения функции. (Значения по умолчанию вычисляются один раз при определении функции; следовательно, изменяемый объект, такой как список или словарь, используемый в качестве значения по умолчанию, будет общим для всех вызовов, не указывающих значение аргумента для соответствующего слота; этого обычно следует избегать.) Если остаются незаполненные слоты, для которых не указано значение по умолчанию, вызывается исключение [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError). В противном случае список заполненных слотов используется как список аргументов для вызова.374375> **Примечание**376>377> Реализация может предоставлять встроенные функции, чьи позиционные параметры не имеют имён, даже если они «названы» для целей документации, и поэтому не могут быть переданы по ключевому слову. В CPython это справедливо для функций, реализованных на C, которые используют [`PyArg_ParseTuple`](https://python-all.ru/3.0/c-api/arg.html#PyArg_ParseTuple) для разбора своих аргументов.378379Если позиционных аргументов больше, чем слотов формальных параметров, вызывается исключение [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), если только не присутствует формальный параметр с синтаксисом `*identifier`; в этом случае этот формальный параметр получает кортеж, содержащий лишние позиционные аргументы (или пустой кортеж, если лишних позиционных аргументов нет).380381Если какой-либо именованный аргумент не соответствует имени формального параметра, вызывается исключение [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError), если только не присутствует формальный параметр с синтаксисом `**identifier`; в этом случае этот формальный параметр получает словарь, содержащий лишние именованные аргументы (с ключами в качестве ключей и значениями аргументов в качестве соответствующих значений), или (новый) пустой словарь, если лишних именованных аргументов нет.382383Если в вызове функции встречается синтаксис `*expression`, то `expression` должно вычисляться в последовательность. Элементы этой последовательности обрабатываются так, будто они являются дополнительными позиционными аргументами; если есть позиционные аргументы *x1*, ..., *xN*, и `expression` вычисляется в последовательность *y1*, ..., *yM*, то это эквивалентно вызову с M+N позиционными аргументами *x1*, ..., *xN*, *y1*, ..., *yM*.384385Следствием этого является то, что хотя синтаксис `*expression` может встречаться *после* некоторых именованных аргументов, он обрабатывается *до* именованных аргументов (и аргумента `**expression`, если таковой имеется – см. ниже). Итак:386387```python388>>> def f(a, b):389...  print(a, b)390...391>>> f(b=1, *(2,))3922 1393>>> f(a=1, *(2,))394Traceback (most recent call last):395  File "<stdin>", line 1, in ?396TypeError: f() got multiple values for keyword argument 'a'397>>> f(1, *(2,))3981 2399```400401Необычно использовать одновременно именованные аргументы и синтаксис `*expression` в одном вызове, поэтому на практике такая путаница не возникает.402403Если в вызове функции присутствует синтаксис `**expression`, то `expression` должно быть отображением, содержимое которого обрабатывается как дополнительные именованные аргументы. Если имя аргумента встречается как в `expression`, так и в явном именованном аргументе, вызывается исключение [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError).404405Формальные параметры с синтаксисом `*identifier` или `**identifier` не могут использоваться как слоты позиционных аргументов или как имена именованных аргументов.406407Вызов всегда возвращает какое-либо значение, возможно `None`, если только не возникает исключение. Способ вычисления этого значения зависит от типа вызываемого объекта.408409Если это–410411**пользовательская функция:**412413Выполняется блок кода функции, которому передаётся список аргументов. Первое, что делает блок кода – связывает формальные параметры с аргументами; это описано в разделе [*Function definitions*](https://python-all.ru/3.0/reference/compound_stmts.html#function). Когда блок кода выполняет инструкцию [`return`](https://python-all.ru/3.0/reference/simple_stmts.html#return), она задаёт возвращаемое значение вызова функции.414415**встроенная функция или метод:**416417Результат зависит от интерпретатора; описания встроенных функций и методов см. в [*Встроенные функции*](https://python-all.ru/3.0/library/functions.html#built-in-funcs).418419**объект класса:**420421Возвращается новый экземпляр этого класса.422423**метод экземпляра класса:**424425Вызывается соответствующая пользовательская функция, со списком аргументов, который на один длиннее списка аргументов вызова: экземпляр становится первым аргументом.426427**экземпляр класса:**428429Класс должен определять метод [`__call__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__call__); результат будет таким же, как если бы этот метод был вызван.430431## Оператор возведения в степень432433Оператор возведения в степень имеет более высокий приоритет, чем унарные операторы слева, и более низкий приоритет, чем унарные операторы справа. Синтаксис:434435```436437power ::=  primary ["**" u_expr]438```439440Таким образом, в последовательности операторов возведения в степень и унарных операторов без скобок операторы вычисляются справа налево (это не накладывает ограничений на порядок вычисления операндов): `-1**2` даёт `-1`.441442Оператор возведения в степень имеет ту же семантику, что и встроенная функция [`pow()`](https://python-all.ru/3.0/library/functions.html#pow), вызываемая с двумя аргументами: он возвращает левый аргумент, возведённый в степень правого. Числовые аргументы сначала преобразуются к общему типу, и результат имеет этот тип.443444Для операндов типа int результат имеет тот же тип, что и операнды, если только второй аргумент не отрицателен; в этом случае все аргументы преобразуются в float и возвращается результат типа float. Например, `10**2` возвращает `100`, но `10**-2` возвращает `0.01`.445446Возведение `0.0` в отрицательную степень приводит к [`ZeroDivisionError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ZeroDivisionError). Возведение отрицательного числа в дробную степень даёт комплексное число [`complex`](https://python-all.ru/3.0/library/functions.html#complex). (В более ранних версиях это вызывало [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError).)447448## Унарные арифметические операции449450Все унарные арифметические (и побитовые) операции имеют одинаковый приоритет:451452```453454u_expr ::=  power | "-" u_expr | "+" u_expr | "~" u_expr455```456457Унарный оператор `-` (минус) возвращает отрицание своего числового аргумента.458459Унарный оператор `+` (плюс) возвращает свой числовой аргумент без изменений.460461Унарный оператор `~` (инверсия) возвращает побитовую инверсию своего целочисленного аргумента. Побитовая инверсия `x` определяется как `-(x+1)`. Он применим только к целым числам.462463Во всех трёх случаях, если аргумент не имеет правильного типа, вызывается исключение [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError).464465## Бинарные арифметические операции466467Бинарные арифметические операции имеют общепринятые уровни приоритета. Обратите внимание, что некоторые из этих операций также применимы к некоторым нечисловым типам. За исключением оператора возведения в степень, существует только два уровня: один для мультипликативных операторов и один для аддитивных операторов:468469```470471m_expr ::=  u_expr | m_expr "*" u_expr | m_expr "//" u_expr | m_expr "/" u_expr472            | m_expr "%" u_expr473a_expr ::=  m_expr | a_expr "+" m_expr | a_expr "-" m_expr474```475476Оператор `*` (умножения) возвращает произведение своих аргументов. Аргументы должны быть либо оба числами, либо один аргумент – целым числом, а другой – последовательностью. В первом случае числа преобразуются к общему типу и затем перемножаются. Во втором случае выполняется повторение последовательности; отрицательный коэффициент повторения даёт пустую последовательность.477478Операторы `/` (деление) и `//` (целочисленное деление) возвращают частное своих аргументов. Числовые аргументы сначала приводятся к общему типу. Обычное деление целых даёт число с плавающей запятой (float), тогда как целочисленное деление целых даёт целое число; результат эквивалентен математическому делению с последующим применением функции floor (округление вниз). Деление на ноль вызывает исключение [`ZeroDivisionError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ZeroDivisionError).479480Оператор `%` (остаток от деления, modulo) возвращает остаток от деления первого аргумента на второй. Числовые аргументы сначала преобразуются к общему типу. Нулевой правый аргумент вызывает исключение [`ZeroDivisionError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ZeroDivisionError). Аргументы могут быть числами с плавающей запятой, например, `3.14%0.7` равно `0.34` (поскольку `3.14` равно `4*0.7 + 0.34`.) Оператор остатка от деления всегда возвращает результат с тем же знаком, что и его второй операнд (или ноль); абсолютное значение результата строго меньше абсолютного значения второго операнда [\[1\]](https://python-all.ru/3.0/reference/expressions.html#id16).481482Целочисленное деление и остаток от деления связаны следующим тождеством: `x == (x//y)*y + (x%y)`. Целочисленное деление и остаток также связаны со встроенной функцией [`divmod()`](https://python-all.ru/3.0/library/functions.html#divmod): `divmod(x, y) == (x//y, x%y)`. [\[2\]](https://python-all.ru/3.0/reference/expressions.html#id17).483484Помимо выполнения операции взятия остатка над числами, оператор `%` также перегружен для строковых объектов с целью форматирования строк в старом стиле (также известном как интерполяция). Синтаксис форматирования строк описан в Справочнике по библиотеке Python, раздел [*Операции форматирования строк в старом стиле*](https://python-all.ru/3.0/library/stdtypes.html#old-string-formatting).485486Операторы целочисленного деления, остатка от деления и функция [`divmod()`](https://python-all.ru/3.0/library/functions.html#divmod) не определены для комплексных чисел. Вместо этого следует преобразовать в число с плавающей запятой с помощью функции [`abs()`](https://python-all.ru/3.0/library/functions.html#abs), если это уместно.487488Оператор `+` (сложения) вычисляет сумму своих аргументов. Аргументы должны быть либо оба числами, либо оба последовательностями одного типа. В первом случае числа преобразуются к общему типу и затем складываются. Во втором случае последовательности конкатенируются.489490Оператор `-` (вычитания) возвращает разность своих аргументов. Числовые аргументы сначала преобразуются к общему типу.491492## Операции сдвига493494Операции сдвига имеют более низкий приоритет, чем арифметические операции:495496```497498shift_expr ::=  a_expr | shift_expr ( "<<" | ">>" ) a_expr499```500501Эти операторы принимают целые числа в качестве аргументов. Они сдвигают первый аргумент влево или вправо на количество бит, заданное вторым аргументом.502503Сдвиг вправо на *n* битов определяется как деление на `pow(2,n)`. Сдвиг влево на *n* битов определяется как умножение на `pow(2,n)`.504505## Бинарные побитовые операции506507Каждая из трёх побитовых операций имеет свой уровень приоритета:508509```510511and_expr ::=  shift_expr | and_expr "&" shift_expr512xor_expr ::=  and_expr | xor_expr "^" and_expr513or_expr  ::=  xor_expr | or_expr "|" xor_expr514```515516Оператор `&` возвращает побитовое И своих аргументов, которые должны быть целыми числами.517518Оператор `^` возвращает побитовое исключающее ИЛИ (XOR) своих аргументов, которые должны быть целыми числами.519520Оператор `|` возвращает побитовое (включающее) ИЛИ своих аргументов, которые должны быть целыми числами.521522## Сравнения523524В отличие от C, все операции сравнения в Python имеют одинаковый приоритет, который ниже приоритета любых арифметических, сдвиговых или побитовых операций. Также в отличие от C, выражения вида `a < b < c` интерпретируются так, как это принято в математике:525526```527528comparison    ::=  or_expr ( comp_operator or_expr )*529comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="530                   | "is" ["not"] | ["not"] "in"531```532533Сравнения возвращают логические значения: `True` или `False`.534535Сравнения могут объединяться в цепочки произвольным образом, например, `x < y <= z` эквивалентно `x < y and y <= z`, за исключением того, что `y` вычисляется только один раз (но в обоих случаях `z` не вычисляется вообще, если `x < y` оказывается ложным).536537Формально, если *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`, за исключением того, что каждое выражение вычисляется не более одного раза.538539Обратите внимание, что `a op1 b op2 c` не подразумевает никакого сравнения между *a* и *c*, так что, например, `x < y > z` совершенно законно (хотя, возможно, и некрасиво).540541Операторы `<`, `>`, `==`, `>=`, `<=` и `!=` сравнивают значения двух объектов. Объекты не обязательно должны быть одного типа. Если оба являются числами, они преобразуются к общему типу. В противном случае операторы `==` и `!=` *всегда* считают объекты разных типов неравными, а операторы `<`, `>`, `>=` и `<=` возбуждают [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) при сравнении объектов разных типов, которые не реализуют эти операторы для данной пары типов. Поведение сравнения объектов невстроенных типов можно настроить, определив методы расширенного сравнения, такие как [`__gt__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__gt__), описанные в разделе [*Базовые средства настройки*](https://python-all.ru/3.0/reference/datamodel.html#customization).542543Сравнение объектов одного типа зависит от типа:544545- Числа сравниваются арифметически.546- Значения `float('NaN')` и `Decimal('NaN')` являются особыми. Они идентичны сами себе, `x is x`, но не равны себе, `x != x`. Кроме того, сравнение любого значения с не-числом (NaN) вернёт `False`. Например, и `3 < float('NaN')`, и `float('NaN') < 3` вернут `False`.547- Байтовые объекты сравниваются лексикографически с использованием числовых значений своих элементов.548- Строки сравниваются лексикографически с использованием числовых эквивалентов (результата встроенной функции [`ord()`](https://python-all.ru/3.0/library/functions.html#ord)) своих символов. [\[3\]](https://python-all.ru/3.0/reference/expressions.html#id18) Строки и байтовые объекты сравнивать нельзя!549- Кортежи и списки сравниваются лексикографически с помощью сравнения соответствующих элементов. Это означает, что для равенства каждый элемент должен быть равен, а две последовательности должны быть одного типа и иметь одинаковую длину.550551  Если они не равны, последовательности упорядочиваются по первому отличающемуся элементу. Например, `[1,2,x] <= [1,2,y]` ведёт себя так же, как `x <= y`. Если соответствующий элемент отсутствует, более короткая последовательность считается меньшей (например, `[1,2] < [1,2,3]`).552- Отображения (словари) считаются равными тогда и только тогда, когда их отсортированные списки `(key, value)` сравниваются как равные. [\[4\]](https://python-all.ru/3.0/reference/expressions.html#id19) Результаты, отличные от равенства, определяются согласованно, но иначе не определены. [\[5\]](https://python-all.ru/3.0/reference/expressions.html#id20)553- Множества и frozensets определяют операторы сравнения для проверки на подмножество и надмножество. Эти отношения не задают полного порядка (два множества `{1,2}` и {2,3} не равны, не являются ни подмножествами друг друга, ни надмножествами друг друга). Соответственно, множества не подходят в качестве аргументов для функций, которые зависят от полного порядка. Например, [`min()`](https://python-all.ru/3.0/library/functions.html#min), [`max()`](https://python-all.ru/3.0/library/functions.html#max) и [`sorted()`](https://python-all.ru/3.0/library/functions.html#sorted) дают неопределённые результаты, если на вход подаётся список множеств.554- Большинство других объектов встроенных типов считаются неравными, если только это не один и тот же объект; решение о том, какой объект считается меньшим или большим, принимается произвольно, но согласованно в пределах одного выполнения программы.555556Сравнение объектов разных типов зависит от того, поддерживает ли какой-либо из типов явное сравнение. Большинство числовых типов можно сравнивать друг с другом, но сравнения [`float`](https://python-all.ru/3.0/library/functions.html#float) и `Decimal` не поддерживаются, чтобы избежать неизбежной путаницы, возникающей из-за проблем представления, таких как `float('1.1')`, которое представляется неточно и поэтому не равно в точности `Decimal('1.1')`, которое представляется точно. Если сравнение между типами не поддерживается, метод сравнения возвращает `NotImplemented`. Это может создать иллюзию нетранзитивности между поддерживаемыми и неподдерживаемыми сравнениями разных типов. Например, `Decimal(2) == 2` и *2 == float(2)\`*, но `Decimal(2) != float(2)`.557558Операторы [`in`](https://python-all.ru/3.0/reference/expressions.html#in) и [`not in`](https://python-all.ru/3.0/reference/expressions.html#notin) проверяют принадлежность. `x in s` вычисляется как true, если *x* является элементом *s*, и false в противном случае. `x not in s` возвращает отрицание `x in s`. Все встроенные последовательности и множества поддерживают это, а также словари, для которых [`in`](https://python-all.ru/3.0/reference/expressions.html#in) проверяет, содержит ли словарь заданный ключ. Для контейнерных типов, таких как list, tuple, set, frozenset, dict или collections.deque, выражение `x in y` эквивалентно `any(x is e or x == e for val e in y)`.559560Для строк и байтовых типов `x in y` истинно тогда и только тогда, когда *x* является подстрокой *y*. Эквивалентная проверка: `y.find(x) != -1`. Пустые строки всегда считаются подстрокой любой другой строки, поэтому `"" in "abc"` вернёт `True`.561562Для пользовательских классов, которые определяют метод [`__contains__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__contains__), `x in y` истинно тогда и только тогда, когда `y.__contains__(x)` истинно.563564Для пользовательских классов, которые не определяют [`__contains__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__contains__), но определяют [`__getitem__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getitem__), `x in y` истинно тогда и только тогда, когда существует неотрицательный целочисленный индекс *i*, такой что `x == y[i]`, и все меньшие целочисленные индексы не возбуждают исключение [`IndexError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IndexError). (Если возбуждается любое другое исключение, то считается, что [`in`](https://python-all.ru/3.0/reference/expressions.html#in) возбудило это исключение).565566Оператор [`not in`](https://python-all.ru/3.0/reference/expressions.html#notin) определён так, что его истинностное значение противоположно истинностному значению оператора [`in`](https://python-all.ru/3.0/reference/expressions.html#in).567568Операторы [`is`](https://python-all.ru/3.0/reference/expressions.html#is) и [`is not`](https://python-all.ru/3.0/reference/expressions.html#isnot) проверяют идентичность объектов: `x is y` истинно тогда и только тогда, когда *x* и *y* являются одним и тем же объектом. `x is not y` даёт противоположное истинностное значение. [\[6\]](https://python-all.ru/3.0/reference/expressions.html#id21)569570## Булевы операции571572Булевы операции имеют самый низкий приоритет среди всех операций Python:573574```575576expression             ::=  conditional_expression | lambda_form577expression_nocond      ::=  or_test | lambda_form_nocond578conditional_expression ::=  or_test ["if" or_test "else" expression]579or_test                ::=  and_test | or_test "or" and_test580and_test               ::=  not_test | and_test "and" not_test581not_test               ::=  comparison | "not" not_test582```583584В контексте логических операций, а также когда выражения используются операторами управления потоком, следующие значения интерпретируются как ложные: `False`, `None`, числовые нули всех типов, а также пустые строки и контейнеры (включая строки, кортежи, списки, словари, множества и frozenset). Все остальные значения интерпретируются как истинные. Пользовательские объекты могут настраивать своё истинностное значение, предоставляя метод [`__bool__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__bool__).585586Оператор [`not`](https://python-all.ru/3.0/reference/expressions.html#not) возвращает `True`, если его аргумент ложен, и `False` в противном случае.587588Выражение `x if C else y` сначала вычисляет *C* (*not* *x*); если *C* истинно, то вычисляется *x* и возвращается его значение; в противном случае вычисляется *y* и возвращается его значение.589590Выражение `x and y` сначала вычисляет *x*; если *x* ложно, возвращается его значение; в противном случае вычисляется *y* и возвращается полученное значение.591592Выражение `x or y` сначала вычисляет *x*; если *x* истинно, возвращается его значение; в противном случае вычисляется *y* и возвращается полученное значение.593594(Note that neither [`and`](https://python-all.ru/3.0/reference/expressions.html#and) nor [`or`](https://python-all.ru/3.0/reference/expressions.html#or) restrict the value and type they return to `False` and `True`, but rather return the last evaluated argument. This is sometimes useful, e.g., if `s` is a string that should be replaced by a default value if it is empty, the expression `s or 'foo'` yields the desired value. Because [`not`](https://python-all.ru/3.0/reference/expressions.html#not) has to invent a value anyway, it does not bother to return a value of the same type as its argument, so e.g., `not 'foo'` yields `False`, not `''`.)595596## Лямбда-выражения597598```599600lambda_form        ::=  "lambda" [parameter_list]: expression601lambda_form_nocond ::=  "lambda" [parameter_list]: expression_nocond602```603604Лямбда-формы (лямбда-выражения) занимают ту же синтаксическую позицию, что и выражения. Они представляют собой сокращённый способ создания анонимных функций; выражение `lambda arguments: expression` создаёт объект-функцию. Этот безымянный объект ведёт себя как объект-функция, определённый с помощью605606```python607def <lambda>(arguments):608    return expression609```610611Смотрите раздел [*Определения функций*](https://python-all.ru/3.0/reference/compound_stmts.html#function) о синтаксисе списков параметров. Обратите внимание, что функции, созданные с помощью лямбда-форм, не могут содержать инструкции или аннотации.612613## Списки выражений614615```616617expression_list ::=  expression ( "," expression )* [","]618```619620Список выражений, содержащий хотя бы одну запятую, образует кортеж. Длина кортежа равна количеству выражений в списке. Выражения вычисляются слева направо.621622Завершающая запятая требуется только для создания кортежа из одного элемента (т.н. *синглетон*); во всех остальных случаях она необязательна. Одиночное выражение без завершающей запятой не создаёт кортеж, а возвращает значение этого выражения. (Чтобы создать пустой кортеж, используйте пустую пару круглых скобок: `()`.)623624## Порядок вычисления625626Python вычисляет выражения слева направо. Обратите внимание, что при вычислении присваивания сначала вычисляется правая часть, а затем левая.627628В следующих строках выражения будут вычисляться в арифметическом порядке их суффиксов:629630```python631expr1, expr2, expr3, expr4632(expr1, expr2, expr3, expr4)633{expr1: expr2, expr3: expr4}634expr1 + expr2 * (expr3 - expr4)635expr1(expr2, expr3, *expr4, **expr5)636expr3, expr4 = expr1, expr2637```638639## Сводка640641The following table summarizes the operator precedences in Python, from lowest precedence (least binding) to highest precedence (most binding). Operators in the same box have the same precedence. Unless the syntax is explicitly given, operators are binary. Operators in the same box group left to right (except for comparisons, including tests, which all have the same precedence and chain from left to right – see section [*Comparisons*](https://python-all.ru/3.0/reference/expressions.html#comparisons) – and exponentiation, which groups from right to left).642643| Оператор | Описание |644| --- | --- |645| [`lambda`](https://python-all.ru/3.0/reference/expressions.html#lambda) | Лямбда-выражение |646| [`or`](https://python-all.ru/3.0/reference/expressions.html#or) | Логическое ИЛИ |647| [`and`](https://python-all.ru/3.0/reference/expressions.html#and) | Логическое И |648| [`not`](https://python-all.ru/3.0/reference/expressions.html#not) *x* | Логическое НЕ |649| [`in`](https://python-all.ru/3.0/reference/expressions.html#in), [`not`](https://python-all.ru/3.0/reference/expressions.html#not) [`in`](https://python-all.ru/3.0/reference/expressions.html#in) | Проверка принадлежности |650| [`is`](https://python-all.ru/3.0/reference/expressions.html#is), [`is not`](https://python-all.ru/3.0/reference/expressions.html#isnot) | Проверка идентичности |651| `<`, `<=`, `>`, `>=`, `!=`, `==` | Сравнения |652| `\|` | Побитовое ИЛИ |653| `^` | Побитовое исключающее ИЛИ |654| `&` | Побитовое И |655| `<<`, `>>` | Сдвиги |656| `+`, `-` | Сложение и вычитание |657| `*`, `/`, `//`, `%` | Умножение, деление, остаток |658| `+x`, `-x` | Положительное, отрицательное |659| `~x` | Побитовое отрицание |660| `**` | Возведение в степень |661| `x[index]` | Индексация |662| `x[index:index]` | Срез |663| `x(arguments...)` | Вызов |664| `x.attribute` | Обращение к атрибуту |665| `(expressions...)` | Связывание, литерал кортежа, генераторные выражения |666| `[expressions...]` | Отображение списка |667| `{expressions...}` | Отображение словаря или множества |668669Сноски670671| [\[1\]](https://python-all.ru/3.0/reference/expressions.html#id8) | Хотя `abs(x%y) < abs(y)` математически верно, для чисел с плавающей запятой это может не выполняться численно из-за округления. Например, на платформе, где число с плавающей запятой Python – это число двойной точности IEEE 754, для того чтобы `-1e-100 % 1e100` имело тот же знак, что и `1e100`, вычисленный результат равен `-1e-100 + 1e100`, что численно в точности равно `1e100`. Функция `fmod()` из модуля [`math`](https://python-all.ru/3.0/library/math.html#module-math) возвращает результат, знак которого совпадает со знаком первого аргумента, и в данном случае возвращает `-1e-100`. Какой подход более подходит, зависит от приложения. |672| --- | --- |673674| [\[2\]](https://python-all.ru/3.0/reference/expressions.html#id9) | Если x очень близок к точному целому кратному y, возможно, что `x//y` будет на единицу больше, чем `(x-x%y)//y`, из-за округления. В таких случаях Python возвращает второй результат, чтобы сохранить `divmod(x,y)[0] * y + x % y` очень близким к `x`. |675| --- | --- |676677| [\[3\]](https://python-all.ru/3.0/reference/expressions.html#id11) | Хотя сравнение строк на уровне байтов имеет смысл, оно может быть неочевидным для пользователей. Например, строки `"\u00C7"` и `"\u0327\u0043"` сравниваются по-разному, хотя обе представляют один и тот же символ Юникода (ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА C С СЕДИЛЬЮ). Для сравнения строк, понятного человеку, используйте [`unicodedata.normalize()`](https://python-all.ru/3.0/library/unicodedata.html#unicodedata.normalize). |678| --- | --- |679680| [\[4\]](https://python-all.ru/3.0/reference/expressions.html#id12) | Реализация вычисляет это эффективно, без построения списков или сортировки. |681| --- | --- |682683| [\[5\]](https://python-all.ru/3.0/reference/expressions.html#id13) | Более ранние версии Python использовали лексикографическое сравнение отсортированных списков (ключ, значение), но это было очень затратно для обычного случая сравнения на равенство. Ещё более ранняя версия Python сравнивала словари только по идентичности, но это вызывало удивление, поскольку пользователи ожидали возможности проверить словарь на пустоту, сравнив его с `{}`. |684| --- | --- |685686| [\[6\]](https://python-all.ru/3.0/reference/expressions.html#id14) | Из-за автоматической сборки мусора, списков свободных блоков и динамической природы дескрипторов в некоторых случаях использования оператора [`is`](https://python-all.ru/3.0/reference/expressions.html#is) может наблюдаться необычное поведение, например при сравнении методов экземпляров или констант. Обратитесь к их документации за подробностями. |687| --- | --- |688