Различия между версиями 2 и 3
Версия 2 от 2017-08-15 14:53:04
Размер: 3989
Редактор: FrBrGeorge
Комментарий:
Версия 3 от 2017-08-18 13:22:09
Размер: 4557
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 79: Строка 79:
 * Вот зачем нужен `with`
 * '''TODO'''
 {{{#!highlight python3
class A_Exc(Exception):
    pass

class B_Exc(A_Exc):
    pass

class C_Exc(B_Exc):
    pass


def evolve(*excs):
    for E in excs:
        raise E

for E in A_Exc, B_Exc, C_Exc:
    try:
        evolve(E)
    except B_Exc:
        print("B")
    except C_Exc:
        print("C")
    except A_Exc:
        print("A")
}}}
 Показателен вывод:
 {{{
A
B
B
}}}
 Последнее '''B''' — потому что исключение `C_Exc` унаследовано от `B_Exc` и обрабатывается первым подходящим `except`

Исключения. Оценка сложности алгоритмов

Исключения

  • {*} Примеры все объекты вида …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

       1  def raiseadd(a,b):
       2     if a>b:
       3         raise ValueError("{} must be less than {}".format(a,b))
       4     return a+b 
       5 
       6 print(raiseadd(5,6))
       7 print(raiseadd(3,2))
    
  • try … except:

    • просто except

    • except для конкретного исключения

      • …и всех его дочерних классов!
      • Exception как родитель почти всех других исключений (но не BaseException, некоторые исключения всё-таки не надо обрабатывать)

      • клаузы else и finally

  • Зачем нужны
    • «ошибки»
    • непрямая обработка событий
  • {*} пример с двойным вызовом функции

       1 def funerr(a,b):
       2     if a<b:
       3         raise ValueError("A must be greater than B")
       4     return a/b 
       5 
       6 def justfun(a,b):
       7     c = funerr(2*a, 3*b)
       8     return c
       9 
      10 for a,b in (10,3),(5,5),(10,0):
      11     try:
      12         c = justfun(a,b)
      13     except ValueError: 
      14         c = -1
      15     print(c)
    
  • {*} пример с StopIteration

       1 class IterHand:
       2     def __init__(self, n):
       3         self.n = n
       4 
       5     def __iter__(self):
       6         return self
       7 
       8     def __next__(self):
       9         if self.n>0:
      10             self.n -= 1
      11             return self.n
      12         else:
      13             raise StopIteration("Handmade iterator stopped")
      14 
      15 for c in IterHand(5):
      16     print(c)
    
  • А как делать свои исключения?
    • наследовать!
       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)
  • все возможные сочетания

Python/Summer2017/2017-07-14 (последним исправлял пользователь FrBrGeorge 2017-08-18 13:22:09)