compound_stmts.md
1> **Источник:** https://python-all.ru/2.7/reference/compound_stmts.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 7. Составные инструкции89Составные инструкции содержат (группы) других инструкций; они влияют на выполнение этих других инструкций или управляют им. В общем случае составные инструкции охватывают несколько строк, хотя в простых вариантах вся составная инструкция может помещаться в одну строку.1011Инструкции [`if`](https://python-all.ru/2.7/reference/compound_stmts.html#if), [`while`](https://python-all.ru/2.7/reference/compound_stmts.html#while) и [`for`](https://python-all.ru/2.7/reference/compound_stmts.html#for) реализуют традиционные конструкции управления потоком. [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try) определяет обработчики исключений и/или код очистки для группы инструкций. Определения функций и классов также синтаксически являются составными инструкциями.1213Составные инструкции состоят из одного или более «предложений». Предложение состоит из заголовка и «набора инструкций». Заголовки предложений конкретной составной инструкции находятся на одном уровне отступа. Каждый заголовок предложения начинается с уникального идентифицирующего ключевого слова и заканчивается двоеточием. Набор инструкций – это группа инструкций, управляемая предложением. Набор инструкций может быть одной или несколькими простыми инструкциями, разделёнными точкой с запятой, на той же строке, что и заголовок, после двоеточия заголовка, или одной или несколькими инструкциями с отступом на последующих строках. Только последняя форма набора инструкций может содержать вложенные составные инструкции; следующий пример недопустим, в основном потому, что было бы неясно, к какому предложению [`if`](https://python-all.ru/2.7/reference/compound_stmts.html#if) относится последующее предложение [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else):1415```python16if test1: if test2: print x17```1819Также обратите внимание, что в этом контексте точка с запятой связывает сильнее, чем двоеточие, поэтому в следующем примере будут выполнены либо все инструкции [`print`](https://python-all.ru/2.7/reference/simple_stmts.html#print), либо ни одна:2021```python22if x < y < z: print x; print y; print z23```2425Подводя итог:2627```2829compound_stmt ::= if_stmt30 | while_stmt31 | for_stmt32 | try_stmt33 | with_stmt34 | funcdef35 | classdef36 | decorated37suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT38statement ::= stmt_list NEWLINE | compound_stmt39stmt_list ::= simple_stmt (";" simple_stmt)* [";"]40```4142Обратите внимание, что инструкции всегда заканчиваются `NEWLINE`, за которым возможно следует `DEDENT`. Также обратите внимание, что необязательные продолжения предложений всегда начинаются с ключевого слова, которое не может начинать инструкцию, поэтому неоднозначности отсутствуют (проблема «висячего [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else)» в Python решается требованием отступа для вложенных инструкций [`if`](https://python-all.ru/2.7/reference/compound_stmts.html#if)).4344Форматирование грамматических правил в следующих разделах помещает каждое предложение на отдельную строку для ясности.4546## 7.1. Инструкция [`if`](https://python-all.ru/2.7/reference/compound_stmts.html#if)4748Инструкция [`if`](https://python-all.ru/2.7/reference/compound_stmts.html#if) используется для условного выполнения:4950```5152if_stmt ::= "if" expression ":" suite53 ( "elif" expression ":" suite )*54 ["else" ":" suite]55```5657Он выбирает ровно один из наборов инструкций, вычисляя выражения одно за другим, пока одно из них не окажется истинным (см. раздел [Булевы операции](https://python-all.ru/2.7/reference/expressions.html#booleans) для определения истины и лжи); затем этот набор выполняется (и никакая другая часть инструкции [`if`](https://python-all.ru/2.7/reference/compound_stmts.html#if) не выполняется и не вычисляется). Если все выражения ложны, выполняется набор инструкций предложения [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else), если оно присутствует.5859## 7.2. Инструкция [`while`](https://python-all.ru/2.7/reference/compound_stmts.html#while)6061Инструкция [`while`](https://python-all.ru/2.7/reference/compound_stmts.html#while) используется для повторного выполнения, пока выражение истинно:6263```6465while_stmt ::= "while" expression ":" suite66 ["else" ":" suite]67```6869Эта инструкция многократно проверяет выражение и, если оно истинно, выполняет первый набор инструкций; если выражение ложно (возможно, при первой проверке), то набор инструкций предложения [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else), если оно присутствует, выполняется, и цикл завершается.7071Инструкция [`break`](https://python-all.ru/2.7/reference/simple_stmts.html#break), выполненная в первом наборе, завершает цикл, не выполняя набор инструкций предложения [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else). Инструкция [`continue`](https://python-all.ru/2.7/reference/simple_stmts.html#continue), выполненная в первом наборе, пропускает оставшуюся часть набора и возвращается к проверке выражения.7273## 7.3. Инструкция [`for`](https://python-all.ru/2.7/reference/compound_stmts.html#for)7475Инструкция [`for`](https://python-all.ru/2.7/reference/compound_stmts.html#for) используется для перебора элементов последовательности (например, строки, кортежа или списка) или другого итерируемого объекта:7677```7879for_stmt ::= "for" target_list "in" expression_list ":" suite80 ["else" ":" suite]81```8283Список выражений вычисляется один раз; он должен давать итерируемый объект. Для результата `expression_list` создаётся итератор. Затем набор инструкций выполняется один раз для каждого элемента, предоставленного итератором, в порядке возрастания индексов. Каждый элемент по очереди присваивается целевому списку с использованием стандартных правил присваивания, после чего выполняется набор инструкций. Когда элементы исчерпаны (что происходит немедленно, если последовательность пуста), выполняется набор инструкций в предложении [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else), если оно присутствует, и цикл завершается.8485Инструкция [`break`](https://python-all.ru/2.7/reference/simple_stmts.html#break), выполненная в первом наборе инструкций, завершает цикл без выполнения набора инструкций предложения [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else). Инструкция [`continue`](https://python-all.ru/2.7/reference/simple_stmts.html#continue), выполненная в первом наборе инструкций, пропускает оставшуюся часть набора инструкций и переходит к следующему элементу или к предложению [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else), если следующего элемента не было.8687Блок может присваивать значения переменным в целевом списке; это не влияет на следующий присваиваемый элемент.8889Целевой список не удаляется после завершения цикла, но если последовательность пуста, цикл вообще не присвоит ему никаких значений. Подсказка: встроенная функция [`range()`](https://python-all.ru/2.7/library/functions.html#range) возвращает последовательность целых чисел, подходящую для эмуляции эффекта паскалевского `for i := a to b do`; например, `range(3)` возвращает список `[0, 1, 2]`.9091> **Примечание**92>93> Существует тонкость, когда последовательность изменяется в цикле (это возможно только для изменяемых последовательностей, например списков). Для отслеживания того, какой элемент будет использован следующим, применяется внутренний счётчик, который увеличивается на каждой итерации. Когда этот счётчик достигает длины последовательности, цикл завершается. Это означает, что если набор инструкций удаляет текущий (или предыдущий) элемент из последовательности, следующий элемент будет пропущен (поскольку он получает индекс текущего элемента, который уже был обработан). Аналогично, если набор инструкций вставляет элемент в последовательность перед текущим элементом, текущий элемент будет обработан снова на следующем проходе цикла. Это может привести к неприятным ошибкам, которых можно избежать, создав временную копию с помощью среза всей последовательности, например:94>95> ```python96> for x in a[:]:97> if x < 0: a.remove(x)98> ```99100## 7.4. Инструкция [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try)101102Инструкция [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try) задаёт обработчики исключений и/или код очистки для группы инструкций:103104```105106try_stmt ::= try1_stmt | try2_stmt107try1_stmt ::= "try" ":" suite108 ("except" [expression [("as" | ",") identifier]] ":" suite)+109 ["else" ":" suite]110 ["finally" ":" suite]111try2_stmt ::= "try" ":" suite112 "finally" ":" suite113```114115Изменено в версии 2.5: В предыдущих версиях Python [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try)…[`except`](https://python-all.ru/2.7/reference/compound_stmts.html#except)…[`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally) не работали. [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try)…[`except`](https://python-all.ru/2.7/reference/compound_stmts.html#except) должны были быть вложены в [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try)…[`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally).116117Предложение(я) [`except`](https://python-all.ru/2.7/reference/compound_stmts.html#except) задают один или несколько обработчиков исключений. Если в предложении [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try) не возникает исключений, обработчик исключений не выполняется. Когда в наборе инструкций [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try) возникает исключение, начинается поиск обработчика исключений. Этот поиск последовательно проверяет предложения except, пока не будет найдено подходящее исключение. Предложение except без выражения, если оно присутствует, должно быть последним; оно соответствует любому исключению. Для предложения except с выражением это выражение вычисляется, и предложение соответствует исключению, если полученный объект «совместим» с исключением. Объект совместим с исключением, если он является классом или базовым классом объекта исключения, или кортежем, содержащим элемент, совместимый с исключением.118119Если ни одно предложение except не соответствует исключению, поиск обработчика исключений продолжается в окружающем коде и в стеке вызовов. [1](https://python-all.ru/2.7/reference/compound_stmts.html#id4)120121Если вычисление выражения в заголовке предложения except вызывает исключение, исходный поиск обработчика отменяется, и начинается поиск нового исключения в окружающем коде и в стеке вызовов (считается, что исключение вызвано всей инструкцией [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try)).122123Когда найдено подходящее предложение except, исключение присваивается цели, указанной в этом предложении except, если она присутствует, и выполняется набор инструкций этого предложения except. Все предложения except должны иметь исполняемый блок. Когда конец этого блока достигнут, выполнение продолжается обычным образом после всего оператора try. (Это означает, что если существуют два вложенных обработчика для одного и того же исключения, и исключение возникает в предложении try внутреннего обработчика, внешний обработчик не будет обрабатывать исключение.)124125Перед выполнением набора инструкций предложения except сведения об исключении присваиваются трём переменным в модуле [`sys`](https://python-all.ru/2.7/library/sys.html#module-sys): `sys.exc_type` получает объект, идентифицирующий исключение; `sys.exc_value` получает параметр исключения; `sys.exc_traceback` получает объект трассировки (см. раздел [Стандартная иерархия типов](https://python-all.ru/2.7/reference/datamodel.html#types)), указывающий на точку в программе, где возникло исключение. Эти сведения также доступны через функцию [`sys.exc_info()`](https://python-all.ru/2.7/library/sys.html#sys.exc_info), которая возвращает кортеж `(exc_type, exc_value, exc_traceback)`. Использование соответствующих переменных считается устаревшим в пользу этой функции, так как их использование небезопасно в многопоточной программе. Начиная с Python 1.5, переменные восстанавливаются до своих предыдущих значений (до вызова) при возврате из функции, обработавшей исключение.126127Необязательное предложение [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else) выполняется, если поток управления покидает блок [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try), не было вызвано исключение и не выполнялся оператор [`return`](https://python-all.ru/2.7/reference/simple_stmts.html#return), [`continue`](https://python-all.ru/2.7/reference/simple_stmts.html#continue) или [`break`](https://python-all.ru/2.7/reference/simple_stmts.html#break). Исключения в предложении [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else) не обрабатываются предшествующими предложениями [`except`](https://python-all.ru/2.7/reference/compound_stmts.html#except).128129Если присутствует [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally), он задаёт обработчик «очистки». Выполняется предложение [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try), включая любые предложения [`except`](https://python-all.ru/2.7/reference/compound_stmts.html#except) и [`else`](https://python-all.ru/2.7/reference/compound_stmts.html#else). Если в каком-либо из предложений возникает исключение и оно не обрабатывается, исключение временно сохраняется. Выполняется предложение [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally). Если есть сохранённое исключение, оно повторно возбуждается в конце предложения [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally). Если предложение [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally) возбуждает другое исключение или выполняет инструкцию [`return`](https://python-all.ru/2.7/reference/simple_stmts.html#return) или [`break`](https://python-all.ru/2.7/reference/simple_stmts.html#break), сохранённое исключение отбрасывается:130131```python132>>> def f():133... try:134... 1/0135... finally:136... return 42137...138>>> f()13942140```141142Информация об исключении недоступна программе во время выполнения предложения [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally).143144Когда оператор [`return`](https://python-all.ru/2.7/reference/simple_stmts.html#return), [`break`](https://python-all.ru/2.7/reference/simple_stmts.html#break) или [`continue`](https://python-all.ru/2.7/reference/simple_stmts.html#continue) выполняется в блоке [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try) оператора [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try)…[`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally), предложение [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally) также выполняется «по выходу». Оператор [`continue`](https://python-all.ru/2.7/reference/simple_stmts.html#continue) недопустим в предложении [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally). (Причина – проблема текущей реализации; это ограничение может быть снято в будущем).145146Возвращаемое значение функции определяется последней выполненной инструкцией [`return`](https://python-all.ru/2.7/reference/simple_stmts.html#return). Поскольку предложение [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally) выполняется всегда, инструкция [`return`](https://python-all.ru/2.7/reference/simple_stmts.html#return), выполненная в предложении [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally), всегда будет последней выполненной:147148```python149>>> def foo():150... try:151... return 'try'152... finally:153... return 'finally'154...155>>> foo()156'finally'157```158159Дополнительную информацию об исключениях можно найти в разделе [Исключения](https://python-all.ru/2.7/reference/executionmodel.html#exceptions), а информация об использовании инструкции [`raise`](https://python-all.ru/2.7/reference/simple_stmts.html#raise) для генерации исключений приведена в разделе [Инструкция raise](https://python-all.ru/2.7/reference/simple_stmts.html#raise).160161## 7.5. Инструкция [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with)162163Новое в версии 2.5.164165Инструкция [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with) используется для обёртывания выполнения блока методами, определёнными контекстным менеджером (см. раздел [Контекстные менеджеры оператора with](https://python-all.ru/2.7/reference/datamodel.html#context-managers)). Это позволяет инкапсулировать распространённые шаблоны использования [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try)…[`except`](https://python-all.ru/2.7/reference/compound_stmts.html#except)…[`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally) для удобного повторного использования.166167```168169with_stmt ::= "with" with_item ("," with_item)* ":" suite170with_item ::= expression ["as" target]171```172173Выполнение оператора [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with) с одним «элементом» происходит следующим образом:1741751. Контекстное выражение (выражение, указанное в [`with_item`](https://python-all.ru/2.7/reference/compound_stmts.html#grammar-token-with-item)) вычисляется для получения менеджера контекста.1762. Метод [`__exit__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__exit__) контекстного менеджера загружается для последующего использования.1773. Метод [`__enter__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__enter__) контекстного менеджера вызывается.1784. Если в операторе [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with) была указана цель, возвращаемое значение из [`__enter__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__enter__) присваивается ей.179180 > **Примечание**181 >182 > Инструкция [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with) гарантирует, что если метод [`__enter__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__enter__) возвращается без ошибки, то [`__exit__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__exit__) будет вызван всегда. Таким образом, если ошибка возникает во время присваивания целевому списку, она будет обрабатываться так же, как ошибка, возникающая внутри набора инструкций. См. шаг 6 ниже.1835. Выполняется блок.1846. Вызывается метод [`__exit__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__exit__) контекстного менеджера. Если исключение привело к выходу из набора инструкций, его тип, значение и трассировка передаются в качестве аргументов в [`__exit__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__exit__). В противном случае передаются три аргумента [`None`](https://python-all.ru/2.7/library/constants.html#None).185186 Если набор инструкций был завершён из-за исключения и возвращаемое значение метода [`__exit__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__exit__) было ложным, исключение возбуждается повторно. Если возвращаемое значение было истинным, исключение подавляется, и выполнение продолжается с инструкции, следующей за оператором [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with).187188 Если набор инструкций был завершён по любой причине, кроме исключения, возвращаемое значение из [`__exit__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__exit__) игнорируется, и выполнение продолжается в обычном месте для того типа завершения, который был выполнен.189190При наличии нескольких элементов менеджеры контекста обрабатываются так, как если бы несколько операторов [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with) были вложены:191192```python193with A() as a, B() as b:194 suite195```196197эквивалентна198199```python200with A() as a:201 with B() as b:202 suite203```204205> **Примечание**206>207> В Python 2.5 инструкция [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with) разрешена только при включённой возможности `with_statement`. В Python 2.6 она всегда включена.208209Изменено в версии 2.7: Поддержка нескольких контекстных выражений.210211> **См. также**212>213> **[**PEP 343**](https://python-all.ru/2.7/reference/compound_stmts.html) – Оператор «with»**214>215> Спецификация, предыстория и примеры для инструкции [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with) в Python.216217## 7.6. Определения функций218219Определение функции создаёт объект пользовательской функции (см. раздел [Стандартная иерархия типов](https://python-all.ru/2.7/reference/datamodel.html#types)):220221```222223decorated ::= decorators (classdef | funcdef)224decorators ::= decorator+225decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE226funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite227dotted_name ::= identifier ("." identifier)*228parameter_list ::= (defparameter ",")*229 ( "*" identifier ["," "**" identifier]230 | "**" identifier231 | defparameter [","] )232defparameter ::= parameter ["=" expression]233sublist ::= parameter ("," parameter)* [","]234parameter ::= identifier | "(" sublist ")"235funcname ::= identifier236```237238Определение функции – это исполняемый оператор. Его выполнение связывает имя функции в текущей локальной области видимости с объектом функции (обёрткой над исполняемым кодом функции). Этот объект функции содержит ссылку на текущую глобальную область видимости, которая будет использоваться при вызове функции.239240Определение функции не выполняет тело функции; оно выполняется только при вызове функции. [2](https://python-all.ru/2.7/reference/compound_stmts.html#id5)241242Определение функции может быть обёрнуто одним или несколькими [выражениями декоратора](https://python-all.ru/2.7/glossary.html#term-decorator). Выражения декоратора вычисляются при определении функции в области видимости, содержащей определение функции. Результат должен быть вызываемым объектом, который вызывается с объектом функции в качестве единственного аргумента. Возвращаемое значение привязывается к имени функции вместо объекта функции. Несколько декораторов применяются вложенным образом. Например, следующий код:243244```python245@f1(arg)246@f2247def func(): pass248```249250эквивалентно:251252```python253def func(): pass254func = f1(arg)(f2(func))255```256257Когда один или несколько [параметров](https://python-all.ru/2.7/glossary.html#term-parameter) верхнего уровня имеют форму *параметр* `=` *выражение*, говорят, что функция имеет «значения параметров по умолчанию». Для параметра со значением по умолчанию соответствующий [аргумент](https://python-all.ru/2.7/glossary.html#term-argument) может быть опущен при вызове, в этом случае подставляется значение параметра по умолчанию. Если параметр имеет значение по умолчанию, все последующие параметры также должны иметь значение по умолчанию – это синтаксическое ограничение, не выраженное в грамматике.258259**Значения параметров по умолчанию вычисляются при выполнении определения функции.** Это означает, что выражение вычисляется один раз при определении функции, и для каждого вызова используется одно и то же «предвычисленное» значение. Это особенно важно понимать, когда параметр по умолчанию является изменяемым объектом, например списком или словарём: если функция модифицирует объект (например, добавляя элемент в список), значение по умолчанию фактически изменяется. Обычно это не соответствует замыслу. Обходной путь – использовать `None` в качестве значения по умолчанию и явно проверять его в теле функции, например:260261```python262def whats_on_the_telly(penguin=None):263 if penguin is None:264 penguin = []265 penguin.append("property of the zoo")266 return penguin267```268269Семантика вызова функций более подробно описана в разделе [Вызовы](https://python-all.ru/2.7/reference/expressions.html#calls). Вызов функции всегда присваивает значения всем параметрам, перечисленным в списке параметров, либо из позиционных аргументов, либо из ключевых аргументов, либо из значений по умолчанию. Если присутствует форма «`*identifier`», она инициализируется кортежем, принимающим любые избыточные позиционные параметры; по умолчанию – пустой кортеж. Если присутствует форма «`**identifier`», она инициализируется новым словарём, принимающим любые избыточные ключевые аргументы; по умолчанию – новый пустой словарь.270271Также можно создавать анонимные функции (функции, не привязанные к имени) для непосредственного использования в выражениях. Для этого используются лямбда-выражения, описанные в разделе [Лямбда-выражения](https://python-all.ru/2.7/reference/expressions.html#lambda). Обратите внимание, что лямбда-выражение – это всего лишь сокращение для упрощённого определения функции; функция, определённая в операторе «[`def`](https://python-all.ru/2.7/reference/compound_stmts.html#def)», может быть передана или присвоена другому имени точно так же, как функция, определённая лямбда-выражением. Форма «[`def`](https://python-all.ru/2.7/reference/compound_stmts.html#def)» на самом деле более мощная, поскольку позволяет выполнять несколько инструкций.272273**Примечание программисту:** Функции – объекты первого класса. Форма «`def`», выполненная внутри определения функции, определяет локальную функцию, которую можно вернуть или передать. Свободные переменные, используемые во вложенной функции, могут обращаться к локальным переменным функции, содержащей def. Подробнее см. раздел [Именование и связывание](https://python-all.ru/2.7/reference/executionmodel.html#naming).274275## 7.7. Определения классов276277Определение класса создаёт объект класса (см. раздел [Стандартная иерархия типов](https://python-all.ru/2.7/reference/datamodel.html#types)):278279```280281classdef ::= "class" classname [inheritance] ":" suite282inheritance ::= "(" [expression_list] ")"283classname ::= identifier284```285286Определение класса является исполняемой инструкцией. Сначала вычисляется список наследования, если он есть. Каждый элемент списка наследования должен быть классом или типом класса, допускающим наследование. Затем тело класса выполняется в новом кадре выполнения (см. раздел [Именование и связывание](https://python-all.ru/2.7/reference/executionmodel.html#naming)) с использованием только что созданного локального пространства имён и исходного глобального пространства имён. (Обычно тело содержит только определения функций.) После завершения выполнения тела класса его кадр выполнения отбрасывается, но локальное пространство имён сохраняется. [3](https://python-all.ru/2.7/reference/compound_stmts.html#id6) Затем создаётся объект класса с использованием списка наследования для базовых классов и сохранённого локального пространства имён для словаря атрибутов. Имя класса связывается с этим объектом класса в исходном локальном пространстве имён.287288**Примечание программисту:** Переменные, определённые в определении класса, являются переменными класса; они разделяются всеми экземплярами. Чтобы создать переменные экземпляра, их можно установить в методе с помощью `self.name = value`. Как переменные класса, так и переменные экземпляра доступны через запись «`self.name`», и переменная экземпляра скрывает переменную класса с тем же именем при таком доступе. Переменные класса можно использовать как значения по умолчанию для переменных экземпляра, но использование изменяемых значений может привести к неожиданным результатам. Для [классов нового стиля](https://python-all.ru/2.7/glossary.html#term-new-style-class) можно использовать дескрипторы для создания переменных экземпляра с различными деталями реализации.289290Определения классов, как и определения функций, могут быть обёрнуты одним или несколькими выражениями [декоратора](https://python-all.ru/2.7/glossary.html#term-decorator). Правила вычисления выражений декоратора такие же, как для функций. Результатом должен быть объект класса, который затем связывается с именем класса.291292Сноски293294**[1](https://python-all.ru/2.7/reference/compound_stmts.html#id1)**295296Исключение распространяется по стеку вызовов, если только не встретится предложение [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally), которое в свою очередь возбуждает другое исключение. Это новое исключение приводит к потере старого.297298**[2](https://python-all.ru/2.7/reference/compound_stmts.html#id2)**299300Строковый литерал, появляющийся как первая инструкция в теле функции, преобразуется в атрибут `__doc__` функции и, следовательно, в [докстринг](https://python-all.ru/2.7/glossary.html#term-docstring) функции.301302**[3](https://python-all.ru/2.7/reference/compound_stmts.html#id3)**303304Строковый литерал, появляющийся в качестве первого оператора в теле класса, преобразуется в элемент `__doc__` пространства имён и, следовательно, в [докстринг](https://python-all.ru/2.7/glossary.html#term-docstring) класса.305