print "Ошибка ввода–вывода"
except ZeroDivisionError:
print "Деление на 0"
except KeyboardInterrupt:
print "Прерывание с клавиатуры"
except:
print "Ошибка"
В этом примере берутся числа из двух файлов и делятся одно на другое. В результате этих нехитрых действий может возникнуть несколько исключительных ситуаций, некоторые из них отмечены в частях except
(здесь использованы стандартные встроенные исключения Python). Последняя часть except
в этом примере улавливает все другие исключения, которые не были пойманы выше. Например, если хотя бы в одном из файлов находится нечисловое значение, функция int()
возбудит исключение ValueError
. Его–то и сможет отловить последняя часть except
. Разумеется, выполнение части try
в случае возникновения ошибки уже не продолжается после выполнения одной из частей except
.
В отличие от других языков программирования, в Python исключения нередко служат для упрощения алгоритмов. Записывая оператор try–except
, программист может думать так: «попробую, а если сорвется — выполнится код в 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
Кроме описанной формы оператора, есть еще форма try–finally
для гарантированного выполнения некоторых действий при передаче управления изнутри оператора try–finally
вовне. Он может применяться для освобождения занятых ресурсов, что требует обязательного выполнения, независимо от произошедших внутри катаклизмов:
try:
...
finally:
print "Обработка гарантированно завершена"
Смешивать вместе формы try–except
и try–finally
нельзя.
Встроенные типы данных
Как уже говорилось, все данные в Python представлены объектами. Имена являются лишь ссылками на эти объекты и не несут нагрузки по декларации типа. Значения встроенных типов имеют специальную поддержку в синтаксисе языка: можно записать литерал строки, числа, списка, кортежа, словаря (и их разновидностей). Синтаксическую же поддержку операций над встроенными типами можно легко сделать доступной и для объектов определяемых пользователей классов.
Следует также отметить, что объекты могут быть неизменчивыми и изменчивыми. Например, строки в Python являются неизменчивыми, поэтому операции над строками создают новые строки.
Карта встроенных типов (с именами функций для приведения к нужному типу и именами классов для наследования от этих типов):
• специальные типы: None
, NotImplemented
и Ellipsis
;
• числа;
○ целые
• обычное целое int
• целое произвольной точности long
• логический bool
○ число с плавающей точкой float
○ комплексное число complex
• последовательности;
○ неизменчивые:
• строка str
;
• Unicode–строка unicode
;
• кортеж tuple
;
○ изменчивые:
• список list
;
• отображения:
○ словарь dict
• объекты, которые можно вызвать:
○ функции (пользовательские и встроенные);
○ функции–генераторы;
○ методы (пользовательские и встроенные);
○ классы (новые и «классические»);
○ экземпляры классов (если имеют метод __call__
);
• модули;
• классы (см. выше);
• экземпляры классов (см. выше);
• файлы file;
• вспомогательные типы buffer
, slice
.
Узнать тип любого объекта можно с помощью встроенной функции type()
.
Тип int и long
Два типа: int
(целые числа) и long
(целые произвольной точности) служат моделью для представления целых чисел. Первый соответствует типу long
в компиляторе C для используемой архитектуры. Числовые литералы можно записать в системах счисления с основанием 8, 10 или 16:
# В этих литералах записано число 10
print 10, 012, 0xA, 10L
Набор операций над числами — достаточно стандартный как по семантике, так и по обозначениям:
>>> print 1 + 1, 3 — 2, 2*2, 7/4, 5%3
2 1 4 1 2
>>> print 2L ** 1000
107150860718626732094842504906000181056140481170553360744375038
837035105112493612249319837881569585812759467291755314682518714
528569231404359845775746985748039345677748242309854210746050623
711418779541821530464749835819412673987675591655439460770629145
71196477686542167660429831652624386837205668069376
>>> print 3 < 4 < 6, 3 >= 5, 4 == 4, 4 != 4 # сравнения
True False True False
>>> print 1 << 8, 4 >> 2, ~4 # побитовые сдвиги и инверсия
256 1–5
>>> for i, j in (0, 0), (0, 1), (1, 0), (1, 1):
... print i, j, ":", i & j, i | j, i ^ j # побитовые операции
...
0 0 : 0 0 0
0 1 : 0 1 1
1 0 : 0 1 1
1 1 : 1 1 0
Значения типа int
должны покрывать диапазон от–2147483648 до 2147483647, а точность целых произвольной точности зависит от объема доступной памяти.
Стоит заметить, что если в результате операции получается значение, выходящее за рамки допустимого, тип int
может быть неявно преобразован в long
:
>>> type(-2147483648)
<type 'int'>
>>> type(-2147483649)