Исключения. Оценка сложности алгоритмов
Исключения
Примеры все объекты вида …Error и …Warning во встроенном пространстве имён
>>> print(*(c for c in dir(__builtins__) if c.endswith('Error') or c.endswith('Warning'))) ArithmeticError AssertionError AttributeError BlockingIOError BrokenPipeError BufferError BytesWarning ChildProcessError ConnectionAbortedError ConnectionError ConnectionRefusedError ConnectionResetError DeprecationWarning EOFError EnvironmentError FileExistsError FileNotFoundError FloatingPointError FutureWarning IOError ImportError ImportWarning IndentationError IndexError InterruptedError IsADirectoryError KeyError LookupError MemoryError NameError NotADirectoryError NotImplementedError OSError OverflowError PendingDeprecationWarning PermissionError ProcessLookupError RecursionError ReferenceError ResourceWarning RuntimeError RuntimeWarning SyntaxError SyntaxWarning SystemError TabError TimeoutError TypeError UnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError Warning ZeroDivisionError >>> 1/0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>> dir.qq Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'builtin_function_or_method' object has no attribute 'qq' >>> bool+2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'type' and 'int'
raise
try … except:
просто except
except для конкретного исключения
- …и всех его дочерних классов!
⇒ Exception как родитель почти всех других исключений (но не BaseException, некоторые исключения всё-таки не надо обрабатывать)
клаузы else и finally
- Зачем нужны
- «ошибки»
- непрямая обработка событий
пример с двойным вызовом функции
пример с StopIteration
- А как делать свои исключения?
- наследовать!
Показателен вывод:1 class A_Exc(Exception): 2 pass 3 4 class B_Exc(A_Exc): 5 pass 6 7 class C_Exc(B_Exc): 8 pass 9 10 11 def evolve(*excs): 12 for E in excs: 13 raise E 14 15 for E in A_Exc, B_Exc, C_Exc: 16 try: 17 evolve(E) 18 except B_Exc: 19 print("B") 20 except C_Exc: 21 print("C") 22 except A_Exc: 23 print("A")
A B B
Последнее B — потому что исключение C_Exc унаследовано от B_Exc и обрабатывается первым подходящим except
Понятие оценки сложности алгоритма
- Оценка сложности: количество операций на единицу обрабатываемых данных
- насколько замедляется алгоритм при количестве данных
- +1
- *2
- → производная!
- насколько замедляется алгоритм при количестве данных
- Индексирование
- Поиск
- Бинарный поиск
- Простая сортировка (~n²)
- Эффективная сортировка (например, слияниями, ~n·log₂n)
- все возможные сочетания