Примечание:
Литералы True и False для обозначения логических значений появились в Python 2.3.
Цикл ДЛЯ выполняет тело цикла для каждого элемента последовательности. В следующем примере выводится таблица умножения:
Листинг
for i in range(1, 10):
for j in range(1, 10):
print "%2i» % (i*j),
Здесь циклы for являются вложенными. Функция range() порождает список целых чисел из полуоткрытого диапазона [1, 10). Перед каждой итерацией счетчик цикла получает очередное значение из этого списка. Полуоткрытые диапазоны общеприняты в Python. Считается, что их использование более удобно и вызывает меньше программистских ошибок. Например, range(len(s)) порождает список индексов для списка s (в Pythonпоследовательности первый элемент имеет индекс 0). Для красивого вывода таблицы умножения применена операция форматирования % (для целых чисел тот же символ используется для обозначения операции взятия остатка от деления). Строка форматирования (задается слева) строится почти как строка форматирования для printf из C.
Функции
Программист может определять собственные функции двумя способами: с помощью оператора def или прямо в выражении, посредством lambda. Второй способ (да и вообще работа с функциями) будет рассмотрен подробнее в лекции по функциональному программированию на Python, а здесь следует привести пример определения и вызова функции:
Листинг
def cena(rub, kop=0):
return "%i руб. %i коп.» % (rub, kop)
print cena(8, 50)
print cena(7)
print cena(rub=23, kop=70)
В этом примере определена функция двух аргументов (из которых второй имеет значение по умолчанию 0). Вариантов вызова этой функции с конкретными параметрами также несколько. Стоит только заметить, что при вызове функции сначала должны идти позиционные параметры, а затем, именованные. Аргументы со значениями по умолчанию должны следовать после обычных аргументов. Оператор return возвращает значение функции. Из функции можно возвратить только один объект , но он может быть кортежем из нескольких объектов.
После оператора def имя cena оказывается связанным с функциональным объектом.
Исключения
В современных программах передача управления происходит не всегда так гладко, как в описанных выше конструкциях. Для обработки особых ситуаций (таких как деление на ноль или попытка чтения из несуществующего файла) применяется механизм исключений. Лучше всего пояснить синтаксис оператора tryexcept следующим примером:
Листинг
try:
res = int(open('a.txt').read()) / int(open('c.txt').read())
print res
except IOError:
print «Ошибка вводавывода»
except ZeroDivisionError:
print «Деление на 0»
except KeyboardInterrupt:
print «Прерывание с клавиатуры»
except:
print «Ошибка»
В этом примере берутся числа из двух файлов и делятся одно на другое. В результате этих нехитрых действий может возникнуть несколько исключительных ситуаций, некоторые из них отмечены в частях except (здесь использованы стандартные встроенные исключения Python). Последняя часть except в этом примере улавливает все другие исключения, которые не были пойманы выше. Например, если хотя бы в одном из файлов находится нечисловое значение, функция int() возбудит исключение ValueError. Егото и сможет отловить последняя часть except. Разумеется, выполнение части try в случае возникновения ошибки уже не продолжается после выполнения одной из частей except.
В отличие от других языков программирования, в Python исключения нередко служат для упрощения алгоритмов. Записывая оператор tryexcept, программист может думать так: «попробую, а если сорвется выполнится код в except». Особенно часто это используется для выражений, в которых значение получается по ключу из отображения:
Листинг
try:
value = dict[key]
except:
value = default_value
Вместо
Листинг
if dict.has_key(key):
value = dict[key]
else:
value = default_value
Примечание:
Пример уже несколько устаревшей идиомы языка Python иллюстрирует только дух этого подхода: в современном Python лучше записать так value = dict.get(key, default_value).
Исключения можно возбуждать и из программы. Для этого служит оператор raise. Заодно следующий пример показывает канонический способ определения собственного исключения:
Листинг
class MyError(Exception):
pass
try:
raise MyError, «my error 1»
except MyError, x:
print «Ошибка:", x
Кстати, все исключения выстроены в иерархию классов, поэтому ZeroDivisionError может быть поймана как ArithmeticError, если соответствующая часть except будет идти раньше.
Для утверждений применяется специальный оператор assert. Он возбуждает AssertionError, если заданное в нем условие неверно. Этот оператор используют для самопроверки программы. В оптимизированном коде он не выполняется, поэтому строить на нем логику алгоритма нельзя. Пример:
Листинг
c = a + b
assert c == a + b
Кроме описанной формы оператора, есть еще форма tryfinally для гарантированного выполнения некоторых действий при передаче управления изнутри оператора tryfinally вовне. Он может применяться для освобождения занятых ресурсов, что требует обязательного выполнения, независимо от произошедших внутри катаклизмов: