Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.26 KB | None | 0 0
  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. * Не забудьте про рекурсию!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement