The Python Language Reference / Справочник по языку Python: 6. Simple statements
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
6. Простые инструкции Hittih 26.07.10 в 09:13 |
|
|
Простые инструкции ограничены пределами одной условной строки. Но в одной условной строке может помещаться несколько простых инструкций, разделённых точкой с запятой ";" . Простые инструкции имеют следующий синтаксис : Hittih 26.07.10 в 09:12 |
||
|
<code>simple_stmt ::= expression_stmt Hittih 11.04.11 в 21:34 |
||
|
6.1. Выражения - инструкции Hittih 26.07.10 в 10:23 |
||
|
Выражение - инструкция используется (в основном интерактивно) для вычисления и показа значения, или (обычно) для вызова процедуры (это такая функция, которая не возвращает результата - а в Питоне возвращает формальный результат "None" ) . Другие применения выражений - инструкций также возможны и бывают полезны. Выражения - инструкции имеют следующий синтаксис : Hittih 26.07.10 в 09:46 |
||
|
<code>expression_stmt ::= expression_list</code> Hittih 26.07.10 в 09:47 |
||
|
Выражение - инструкция обрабатывает список выражений (в частности из одного выражения) . Hittih 26.07.10 в 09:57 |
||
|
В интерактивном режиме, если его результат не "None" , то результат преобразуется в строку встроенной функцией "repr()" , и эта строка выдаётся на стандартный вывод. Hittih 26.07.10 в 10:04 |
||
|
6.2. Инструкции назначения (связывания, присваивания) Hittih 26.07.10 в 10:12 |
||
|
Инструкции назначения используются для (пере)связывания имён со значениями и для изменения атрибутов или элементов изменяемых объектов : Hittih 26.07.10 в 10:23 |
||
|
<code>assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression) Hittih 19.04.11 в 07:14 |
||
|
(Смотри определения синтаксиса последних трёх обозначений в разделе «Primaries» . ) Hittih 20.08.10 в 07:39 |
||
|
Инструкция назначения анализирует список выражений (учитывая, что это может быть одно выражение или список, разделённый запятыми) и назначает каждый получающийся объект последовательно целям из списка, слева направо. Hittih 29.07.10 в 07:53 Инструкция назначения последовательно назначает очередной объект, получившийся в результате вычисления выражения из списка выражений (учитывая, что это может быть одно выражение или список, разделённый запятыми) - соответственно очередной цели из списка целей, в обоих списках - слева направо. Hittih 29.07.10 в 07:53 |
||
|
Назначение определяется рекурсивно – в зависимости от структуры цели назначения (например список) . Если цель является частью изменяемого объекта (атрибут, элемент по индексу) , то сам этот изменяемый объект должен в итоге выполнить назначение и решить допустимо ли оно и, если нужно, может инициировать исключение. Правила, которых придерживаются различные типы, и инициируемые ими исключения – определены в самих этих типах (смотрите раздел «Иерархия стандартных типов» ) . Hittih 18.08.10 в 23:34 |
||
|
Назначение объекта списку целей, который может быть заключён в круглые или квадратные скобки, рекурсивно определяется следующим образом. Hittih 19.08.10 в 00:46 |
||
|
Если этот список целей фактически состоит из единственной цели, то данный объект назначается этой цели. Hittih 19.08.10 в 00:52 |
||
|
Если этот список целей является перечнем целей, разделённых запятыми, то данный объект (источник) должен быть итерируемым и иметь столько же элементов (сколько целей в списке целей), и эти элементы назначаются соответствующим по счёту (слева направо) целям. (Это правило стало менее ограниченным с версии Питона 1.5 (до этого объект источник обязан был быть кортежем) . Теперь, поскольку текстовые данные являются последовательностями, назначение вроде «a, b = "xy"» является допустимым, при условии, что текст имеет строго соответствующую длину.) Hittih 19.08.10 в 01:40 |
||
|
Если в перечне целей присутствует цель, перед которой стоит одна звёздочка, то объект-источник должен быть последовательностью, у которой количество элементов больше или равно количеству целей минус один. Всем целям до цели со звёздочкой назначаются соответствующие по счёту элементы источника. Всем целям после цели со звёздочкой назначаются соответствующие по счёту с конца элементы источника. Перечень оставшихся элементов в последовательности-источнике назначается цели со звёздочкой (этот перечень может быть пустым) . Hittih 19.08.10 в 08:53 |
||
|
Иначе этот объект-источник должен быть последовательностью, у которой количество элементов равно количеству целей, и эти элементы назначаются соответствующим по счёту (слева направо) целям. Hittih 19.08.10 в 09:03 |
||
|
Назначение объекта единственной цели определяется рекурсивно следующим образом. Hittih 19.08.10 в 09:10 |
||
|
Если эта цель является идентификатором (именем) : Hittih 19.08.10 в 09:16 |
||
|
Если это имя не упоминается в текущем блоке кода в инструкциях «global» или «nonlocal» , то это имя связывается с данным объектом в текущей области имён (тоесть, создаётся локальная переменная с этим именем) . Hittih 19.08.10 в 09:23 |
||
|
Иначе это имя связывается в глобальной области имён с данным объектом или во внешней области имён, определённой «nonlocal» , с данным объектом соответственно. Hittih 19.08.10 в 09:34 |
||
|
Данное имя переназначается, если оно уже было назначено. Это может привести к тому, что счётчик ссылок на тот объект, который был связан с данным именем, достигнет ноля, из-за чего у объекта будет вызван деструктор (если имеется) – и объект будет удалён. Hittih 20.08.10 в 04:40 |
||
|
Если эта цель является перечнем целей, заключённым в круглые или квадратные скобки, то данный объект (источник) должен быть итерируемым и с тем же количеством элементов (как в перечне целей) , и эти элементы назначаются соответствующим по счёту (слева направо) целям. Hittih 20.08.10 в 06:55 |
||
|
Если эта цель является указанием (ссылкой) на атрибут, то первичное выражение этой ссылки интерпретируется, что в результате должно дать объект с атрибутами, допускающими назначение – иначе инициируется «TypeError» . Этому полученному объекту предлагается назначить объект-источник соответствующему (своему) атрибуту – если он не может выполнить это назначение, то инициирует исключение (обычно, но не обязательно – «AttributeError» ) . Hittih 20.08.10 в 07:34 |
||
|
Замечание. Если объект является экземпляром класса и данная ссылка на атрибут встречается с обеих сторон оператора назначения, то правое выражение может обращаться как к атрибуту экземпляра так и (если такового нет) к атрибуту класса. А цель в левой части всегда подразумевает атрибут экземпляра – и если его не было, то он создаётся. Таким образом два одинаковых упоминания атрибута не обязательно обращаются к одному и тому же атрибуту : когда выражение в правой части обращается к атрибуту класса – то в левой создаётся новый атрибут экземпляра в качестве цели назначения : Hittih 20.08.10 в 08:16 |
||
|
<code>class Cls: Hittih 20.08.10 в 08:17 |
||
|
Это не обязательно относится к атрибутам-дескрипторам, например, созданным с помощью «<code>property()</code>» . Hittih 01.12.10 в 15:59 |
||
|
Если цель является взятием (указанием) по индексу, то первичное выражение в этом указателе вычисляется. Оно должно давать или объект - изменяемую последовательность (например список) , или объект-отображение (например словарь) . Затем вычисляется выражение, определяющее индекс. Hittih 16.09.10 в 02:08 |
||
|
Если первичное выражение является изменяемой последовательностью (например списком) , то выражение, определяющее индекс, должно давать в результате целое число. Если это число отрицательное, то к нему прибавляется длина данной последовательности. Получившееся в результате значение должно быть неотрицательным целым, меньшим, чем длина данной последовательности. Затем к данной последовательности следует запрос назначить объект-источник элементу с данным значением индекса. Если индекс выходит за границы, то вызывается исключение «<code>IndexError</code>» (назначение последовательности по индексу не может добавлять новый элемент к списку) . Hittih 16.09.10 в 02:48 |
||
|
Если первичное выражение является объектом-отображением (например словарём) , то индекс должен иметь тип совместимый с типом ключей данного отображения, и данному отображению делается запрос создать пару ключ/данные, которая будет ставить в соответствие исходный индекс объекту-источнику. При этом может произойти как замещение уже существовавшей пары ключ/данные новой парой с тем же значением ключа, так и добавление новой пары ключ/данные (если не было ключа с таким значением) . Hittih 16.09.10 в 03:03 |
||
|
Для объектов, определённых пользователем, вызывается метод «<code>__setitem__()</code>» с соответствующими аргументами. Hittih 16.09.10 в 03:06 |
||
|
Если цель является срезом, то первичное выражение в этом указателе вычисляется. Оно должно давать в результате объект - изменяемую последовательность (например список) . Объект-источник должен быть объектом-последовательностью того же типа. Затем вычисляются выражения, определяющие нижнюю и верхнюю границы (если таковые присутствуют) , которые по умолчанию равны нолю и длине последовательности соответственно. Эти границы должны иметь целое значение. Если какая-либо из них отрицательна, к ней прибавляется длина последовательности. Получившиеся в результате границы обрезаются так, чтобы они входили в диапазон с ноля по длину последовательности. И, наконец, данному объекту-последовательности делается запрос заменить элементы попадающие в срез на элементы последовательности источника. Длина среза может отличаться от длины источника, если объект-цель это позволяет – в этом случае длина последовательности-цели изменится. Hittih 16.09.10 в 04:06 |
||
|
Детали реализации «CPython» : в текущей реализации синтаксис для целей взят точно таким же, как и для выражений, и ошибочный синтаксис не принимается в фазе генерации кода, приводя к менее детальным сообщениям об ошибках. Hittih 01.12.10 в 16:12 |
||
|
Осторожно ! Хотя определение операции назначения подразумевает, что упоминание одного и того же объекта и в левой и в правой частях («перекрытие») является «безопасным» (например, «<code>a, b = b, a</code>» обменивает значения двух переменных) , «перекрытие» внутри перечисления переменных - целей назначения – не является «безопасным» ! Например, следующая программа печатает «<code>[0, 2]</code>» : Hittih 16.09.10 в 06:43 |
||
|
<code>x = [0, 1] Hittih 16.09.10 в 07:57 |
||
|
Смотрите также : PEP 3132 - Extended Iterable Unpacking Hittih 16.09.10 в 07:05 |
||
|
6.2.1. Расширенные инструкции назначения Hittih 16.09.10 в 07:08 |
||
|
Расширенное назначение объединяет в одной инструкции операцию над двумя операндами (т.н. «бинарную») и инструкцию назначения : Hittih 16.09.10 в 07:12 |
||
|
<code>augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression) Hittih 16.09.10 в 07:15 |
||
|
(Смотрите определение последних трёх знаков в разделе 5.3. «Primaries» ) Hittih 16.09.10 в 07:42 |
||
|
Расширенное назначение сначала определяет значение цели назначения (которая, в отличие от случая обычной операции назначения, не может быть распаковкой) и списка выражений, затем выполняет соответствующее двухоперандное действие, и затем этот результат назначает цели назначения. Начальное значение цели назначения вычисляется только один раз. Hittih 21.11.10 в 07:27 |
||
|
Выражение расширенного назначения вроде «<code>x += 1</code>» можно переписать как «<code>x = x + 1</code>» , что даёт подобный, но не точно тот же эффект. В «расширенной» версии – «<code>x</code>» вычисляется только один раз. Также, когда это возможно, операция выполняется «на месте», тоесть, вместо создания нового объекта и потом назначения его цели – сразу используется «старый» объект. Hittih 21.11.10 в 07:42 |
||
|
С учётом указанных выше оговорок (о кортежах и множественных целях) – назначения у расширенных назначений обрабатываются так же, как и обычные. Также и (с исключением насчёт исполнения «на месте» ) двухоперандная операция у расширенных назначений обрабатывается так же, как и обычная. Hittih 21.11.10 в 08:05 |
||
|
К целям, являющимся ссылками на атрибуты, относится то же самое предостережение о атрибутах классов и экземпляров, как и для обычных назначений (п. 6.2.) . Hittih 28.11.10 в 09:56 |
||
|
6.3. Инструкция «assert» Hittih 28.11.10 в 10:42 |
||
|
Инструкция «<code>assert</code>» («подтверждение») – это удобный способ вставить в программу контроль (промежуточных результатов) для наладочных целей. Hittih 28.11.10 в 10:54 |
||
|
<code>assert_stmt ::= "assert" expression ["," expression]</code> Hittih 28.11.10 в 10:34 |
||
|
Для короткой формы – «<code>assert expression</code>» – эквивалентом является : Hittih 28.11.10 в 11:02 |
