SHARE
TWEET

Untitled

a guest Dec 14th, 2019 83 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Контрольная работа
  2.  
  3. В контрольной работе 4 задачи, за каждую задачу можно набрать максимум 1 балл.
  4. Для сдачи контрольной работы необходимо по каждой задаче набрать +0.7 баллов.
  5.  
  6. Если суммарно за работу вы наберете 2 или более баллов, то на переписке вам автоматически зачтутся все задачи, за
  7. которые вы на этой итерации набрали +0.7 баллов.
  8.  
  9. ## Задачи
  10.  
  11. #### 1 Merge
  12. Из модулей разрешается использовать только `itertools`, `random` и `collections`.
  13.  
  14. - Напишите генератор, который принимает на вход две неубывающие последовательности и выдает одну объединенную
  15. неубывающую последовательность.
  16. - Используя решение предыдущего пункта, напишите **нерекурсивный генератор**, который принимает на вход произвольную
  17.   последовательность и, используя сортировку слиянием, возвращает элементы в отсортированном порядке.
  18.   Сортировка всей последовательности должна использовать `O(n (log n))` операций.
  19.  
  20. Примечание:
  21. * Последовательность -- любой объект, по которому можно проитерироваться.
  22.  
  23. #### 2. `FixedSizeQueue`
  24. Данное задание - задание на реализацию структуры данных.
  25.  
  26. Вам предлагается реализовать очередь на массиве фиксированного размера.
  27. В качестве состояния очереди разрешается использовать только преаллоцированный лист размера `maxlen` и два индекса.
  28.  
  29. * Очередь не должна оставлять висящие ссылки на объекты, после того как они были вынуты из очереди.
  30. * Очередь должна инициализироваться своим максимальным размером -– `q = FixedSizeQueue(maxlen=10)`.
  31. * Свойство `empty`, возвращающее `True/False`, в зависимости от того, пуста ли очередь. `O(1)`.
  32. * Свойство `full`, возвращающее `True/False`, в зависимости от того, заполнена ли очередь. `O(1)`.
  33. * Метод `len(q)`, возвращающий число элементов в очереди. `O(1)`.
  34. * Метод `q.put(obj)`, добавляющий объект в начало очереди. В случае, если в очереди нет места, необходимо бросить `ValueError`. `O(1)`.
  35. * Метод `q.get()`, достающий объект из конца очереди. В случае, если очередь пуста, необходимо бросить `ValueError`. `O(1)`.
  36. * Оператор `q + obj` должно возвращать новую очередь, никак не связанную с предыдущей, в которую добавлен элемент `obj`. `O(n)`.
  37. * Оператор `q += obj` должно добавлять в текущую очередь элемент `obj`. `O(1)`.
  38. * На очереди должен работать оператор `in`, проверяющий вхождение элемента в очередь. `O(n)`.
  39. * Должно работать итерирование при помощи`for`-синтаксиса `for x in q`. При этом состояние очереди не должно меняться.
  40.  
  41. p.s. `n` -- текущее количество элементов в очереди.
  42.  
  43. #### 3. `@types_tracker`
  44.  
  45. Напишите декоратор `@types_tracker` и функцию `types_info(func)`, которая является генератором и выдает кортежи из двух
  46. элементов:
  47.   1. Словарь, отображающий имена аргументов в их типы, с которыми была вызвана функция `func`
  48.   2. Множество типов возвращаемых значений, которые возникали при вызове функции `func` с такими типами аргументов.
  49.  
  50. Для работы функции `types_info` необходимо, чтобы функция была продекорирована, если это не так, то должно быть
  51. сгенерировано исключение.
  52.  
  53.     @types_tracker
  54.     def foo(a, b=42):
  55.         pass
  56.    
  57.     @types_tracker
  58.     def bar(a, b=42):
  59.         if a < 42:
  60.             return 1
  61.         else:
  62.             return "qwe"
  63.    
  64.     @types_tracker
  65.     def id(a):
  66.         return a
  67.    
  68.     def pretty_print_types_info(func):
  69.         for call_args_types, res_types in types_info(func):
  70.             s = "{}({}) -> {}".format(
  71.                 func.__name__,
  72.                 ", ".join("{}={}".format(k, v.__name__)
  73.                             for k, v in call_args_types.items()),
  74.                 " & ".join(type.__name__ for type in res_types)
  75.             )
  76.             print(s)
  77.    
  78.     >>> foo(1)
  79.     >>> foo(2)
  80.     >>> pretty_print_types_info(foo)
  81.     foo(a=int, b=int) -> NoneType
  82.    
  83.     >>> bar(1)
  84.     >>> bar(42)
  85.     >>> pretty_print_types_info(bar)
  86.     bar(a=int, b=int) -> int & str
  87.    
  88.     >>> id(1)
  89.     >>> id(2.0)
  90.     >>> id(None)
  91.     >>> pretty_print_types_info(id)
  92.     id(a=int) -> int
  93.     id(a=float) -> float
  94.     id(a=NoneType) -> NoneType
  95.  
  96. NB: по примерам несложно понять, что при реализации нужно учитывать типы аргументов по-умолчанию.
  97.  
  98. #### 4. `CallStackPrinter`
  99.  
  100. Ваша задача –- реализовать менеджер контектса, выводящий дерево вызовов функций в аргумент `output`.
  101.  
  102. Пример:
  103.  
  104.     def foo(a):
  105.         bar(a)
  106.         baz()
  107.    
  108.     def bar(b, c=42):
  109.         baz()
  110.    
  111.     def baz():
  112.         pass
  113.    
  114.     with CallStackPrinter(output=sys.stdout):
  115.         foo(1)
  116.         bar(2, c=3)
  117.  
  118. Вывод:
  119.  
  120.     foo(1)
  121.         bar(1)
  122.             baz()
  123.         baz()
  124.     bar(2, c=3)
  125.         baz()
  126.  
  127. Примечания:
  128.  
  129. * Можно считать, что все функции объявлены в глобальной области видимости.
  130. * Учитывать дефолтные значения аргументов не нужно.
  131. * При отрисовке дерева ключевые аргументы нужно отсортировать в лексикографическом порядке.
  132. * Значение `output` по-умолчанию -- `stdout` из модуля `sys`.
  133. * Не забудьте про рекурсию!
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top