Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [ 35 ] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

10.4.1 Инструкция if

Инструкция if используется для выполнения различных действий в зависимости от условий:

if exprl: suitel

[elif expr2: suite2...]

[else: suited]

Инструкция if вычисляет одно за другим выражения exprN в основной ветви и необязательных ветвях elif до тех пор, пока не будет получена истина, и выполняет соответствующий ему блок кода (вся оставшаяся часть инструкции if пропускается). Если все выражения дают ложь, выполняется блок кода suited необязательной ветви else.

10.4.2 Цикл while

Цикл while используется для многократного выполнения действий, пока выполняется условие:

while expr: suitel [else: suite2]

Инструкция while выполняется в следующем порядке:

1. Вычисляется выражение expr и, если оно дает ложь, переходит к пункту 3.

2. Выполняется блок кода suitel. При этом выполнение в блоке инструкции break немедленно прерывает выполнение цикла (пункт 3 не выполняется), а выполнение инструкции continue прерывает выполнение блока кода, после чего выполнение цикла продолжается с пункта 1. После окончания выполнения блока suitel, выполнение цикла продолжается с пункта 1.

3. Выполняется блок кода suite2 (ветвь else). Инструкции break и continue в этом блоке считаются относящимися к внешнему циклу.

Обратите внимание, что каждая ветвь любой составной инструкции всегда заканчиваются переходом на новую строку. Кроме того, во избежание неоднозначностей, дополнительные ветви всегда начинаются с ключевого слова, которое никогда не используется в начале инструкций. Характерная для таких языков, как C, проблема отнесения ветви else решается в языке Python требованием правильного использования отступов во вложенных составных инструкциях.



10.4.3 Цикл for

Инструкция for используется для перебора элементов последовательности:

for lvalue in sequence: suitel [else: suite2]

Выражение sequence вычисляется один раз и должно давать последовательность (объект, для которого определена операция получения элемента по индексу; если индекс выходит за пределы диапазона, должно генерироваться исключение IndexError). Для каждого элемента последовательности sequence в порядке возрастания индексов, начиная с 0, выполняется присваивание lvalue элемента (на элемент item и параметр lvalue распространяются обычные правила, действующие при выполнении инструкции присваивания lvalue = item; см. раздел 10.3.2) и выполняется блок кода suitel. После того как последовательность исчерпана (определяется по сгенерированному исключению IndexError), если присутствует ветвь else, выполняется блок suite2.

Выполнение инструкции break в блоке suitel немедленно прерывает выполнение цикла (ветвь else игнорируется). При выполнении инструкции continue в блоке suitel пропускается остаток блока и выполнение цикла продолжается после присваивания lvalue следующего элемента последовательности sequence или выполняется ветвь else, если в последовательности нет следующего элемента.

Вы можете присваивать переменной или переменным, входящим в lvalue, - это никак не отразится на следующем элементе, который будет присвоен lvalue. Переменные, входящие в lvalue не удаляются после окончания выполнения цикла и сохраняют последние присвоенные им значения. Однако, если последовательность sequence пустая, lvalue не будет присвоено никакое значение (таким образом, используя эти переменные без дополнительной проверки, Вы имеете шанс получить ошибку NameError). См. также описания встроенных функций range() и xrange() в главе 12.

Будьте внимательны, изменяя последовательность, элементы которой Вы перебираете. Текущий элемент последовательности определяется значением внутреннего счетчика. Конец последовательности определяется по исключению IndexError при попытке получить очередной элемент. Таким образом, если в блоке suitel Вы удалите текущий или один из пройденных элементов последовательности, следующий элемент будет пропущен. Аналогично, если вы добавите в последовательность новый элемент перед текущим, тело цикла для текущего элемента будет выполнено еще раз. Такое поведение может привести к неприятным ошибкам, которых обычно можно избежать, если перебирать элементы копии исходной последовательности, например:

for x in a[:]:

if x < 0: a.remove(x)



10.4.4 Инструкция try

Существует две формы инструкции try. Их нельзя смешивать (то есть, инструкция try не может содержать одновременно ветви except и finally), однако могут быть вложенными друг в друга.

С помощью первой формы Вы определяете обработчики исключений: try: suitel

except [exc classl [, lvaluel]]: suite2 [...]

[else: suited]

Сначала выполняется тело основной ветви - suitel, и если код не генерирует исключение, выполняется блок suited (необязательная ветвь else). Если же код в блоке suitel генерирует исключение, последовательно проверяются (в порядке их следования) ветви except до тех пор, пока не будет найдена ветвь except, удовлетворяющая сгенерированному исключению. Ветвь except без аргументов, если присутствует, должна быть последней ветвью except (в противном случае генерируется исключение SyntaxError) - удовлетворяет всем исключениям. Если указано выражение exc classN, оно вычисляется и ветвь считается удовлетворяющей исключение, если полученный объект совместим с исключением. Объект exc classN является совместимым с исключением, если исключение является экземпляром класса exc classN или производного от него класса или является строкой равной exc classN. Объект exc classN также является совместимым с исключением, если он является кортежем, содержащим объект, совместимый с исключением (при этом кортеж может содержать вложенные кортежи).

Если ни одна из ветвей except не удовлетворяет исключению, поиск обработчика продолжается во внешнем блоке try (если такой имеется) и т. д. Если исключение генерируется при вычислении выражения exc classN, обработка исходного исключения прекращается и производится поиск обработчика нового исключения во внешнем блоке (как будто вся инструкция try сгенерировала исключение).

Если найдена ветвь except, удовлетворяющая исключению, исключение (если оно является экземпляром класса) или ассоциированное с ним значение (если исключение является строкой) присваивается параметру lvalueN (любое выражение, которому допускается присваивание - см. раздел 10.3.2), если он задан, выполняется блок кода ветви (suiteN) и выполнение продолжается инструкций следующих за инструкцией try (исключение считается обработанным). Таким образом, если имеется две вложенных инструкции try и исключительная ситуация возникла в блоке try внутренней инструкции, обработчик внешней инструкции не будет обрабатывать исключение.

Перед выполнением блока ветви except информация об исключении сохраняется и может быть получена с помощью функции sys.exc info() - функция возвращает кортеж, состоящий из типа исключения (класс или строка), самого исключения (если



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [ 35 ] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145