Advertisement
padznich

Mentor_2

Apr 12th, 2019
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.88 KB | None | 0 0
  1. """
  2. Базовые возможности Python
  3. 1) Напишите функцию analyze_students, которая принимает структуру следующего вида:
  4.  
  5. {
  6.    "student_name_1": {
  7.        "subject_1": [mark_1, mark_2, ...],
  8.        "subject_2": [mark_1, mark_2, ...],
  9.        ...
  10.    },
  11.    "student_name_2": {
  12.        ...
  13.    },
  14.    ...
  15. }
  16.  
  17. С помощью генератора множеств соберите ответ следующего вида:
  18. {
  19.    ("student_name_1", "subject_1", multiplication_of_marks),
  20.    ("student_name_1", "subject_2", multiplication_of_marks),
  21.    ...
  22. }
  23.  
  24. Пояснение: множество должно содержать кортежи по три элемента - все сочетания студентов с его предметами, а третий элемент - результат перемножения всех оценок по этому предмету ¯\_(ツ)_/¯. В изначальных данных имена студентов и названия предметов должны быть строками, а лист оценок должен содержать только целые числа.
  25. Содержимое функции должно быть реализовано в одну строку (pep8 по длине строки не проверяется) одним генератором: return ....
  26. Также должны игнорироваться все результаты по предмету "1C" (C - английская).
  27.  
  28. 2) Напишите функцию validate_data, которая принимает данные в том же формате и проверяет, что все имена студентов и названия предметов - строки, а все оценки в листе - целые числа (int). Если хоть одно условие по типам нарушено - необходимо вызвать TypeError. Если все оценки - целые числа, но среди них есть хоть одна меньше 1 или больше 10 - вызвать ValueError. Если все имена студентов и названия предметов - строки, но хоть в одном из них содержится не английская буква или цифра - также вызываем ValueError. Если все проверки прошли успешно - вернуть True.
  29.  
  30. 3) Напишите к функциям аннотации (вложенные типы указывать не обязательно).
  31.  
  32. P.S. В первую функцию гарантированно будут передаваться только валидные данные.
  33. Запрещено использование импортов (если в коде ниже они прописаны, то вы можете их использовать в таком виде, но перед загрузкой решения сами импорты нужно удалить из файла - они будут подставлены автоматически), а также операторов open, exec и eval.
  34. """
  35.  
  36. def analyze_students(data: typing.Dict[str, typing.Dict]) -> typing.Set[typing.Tuple]:
  37.     # TODO
  38.     pass
  39.  
  40.  
  41. def validate_data(data: typing.Dict[str, typing.Dict]) -> bool:
  42.     # TODO
  43.     pass
  44.  
  45.  
  46. # Test data
  47. data_1 = {
  48.             'Anton': {
  49.                 'Python': [10, 9, 10],
  50.                 'Django': [10, 10, 10, 10],
  51.             },
  52.             'Alex': {
  53.                 'C++': [9, 9],
  54.                 'Java': [8, 8, 10],
  55.                 'Assembler': [7]
  56.             },
  57.             'Loki': {
  58.                 '1C': [10, 10, 10, 10, 10],
  59.                 'Ruby': [10, 10, 10, 10, 10]
  60.             }
  61.         }
  62.  
  63. import os
  64. from unittest import TestCase
  65. import pep8
  66.  
  67. from StudentsLab.private_settings import BASE_DIR
  68. from .answer_5058 import analyze_students, validate_data
  69.  
  70.  
  71. class TaskTest(TestCase):
  72.     def test_1(self):
  73.         data = {
  74.             'Anton': {
  75.                 'Python': [10, 9, 10],
  76.                 'Django': [10, 10, 10, 10],
  77.             },
  78.             'Alex': {
  79.                 'C++': [9, 9],
  80.                 'Java': [8, 8, 10],
  81.                 'Assembler': [7]
  82.             },
  83.             'Loki': {
  84.                 '1C': [10, 10, 10, 10, 10],
  85.                 'Ruby': [10, 10, 10, 10, 10]
  86.             }
  87.         }
  88.         self.assertEqual(
  89.             analyze_students(data),
  90.             {
  91.                 ('Anton', 'Python', 900),
  92.                 ('Anton', 'Django', 10000),
  93.                 ('Alex', 'C++', 81),
  94.                 ('Alex', 'Java', 640),
  95.                 ('Alex', 'Assembler', 7),
  96.                 ('Loki', 'Ruby', 100000),
  97.             }
  98.         )
  99.  
  100.     def test_2(self):
  101.         with open(
  102.             os.path.join(
  103.                 BASE_DIR, 'Main', 'task_tests', 'answers', 'answer_5058.py'
  104.             ), 'r'
  105.         ) as hw_file:
  106.             hw_text = hw_file.read()
  107.             task_index = hw_text.index('def analyze_students')
  108.             self.assertEqual(
  109.                 1,
  110.                 hw_text[
  111.                     task_index:
  112.                     task_index + hw_text[task_index:].index('return')
  113.                 ].count('\n')
  114.             )
  115.  
  116.     def test_3(self):
  117.         data = {
  118.             'Anton': {
  119.                 'Python': [10, 9, 10],
  120.                 'Django': [10, 10, 10, 10],
  121.             },
  122.             'Alex': {
  123.                 'C': [9, 9],
  124.                 'Java': [8, 8, 10],
  125.                 'Assembler': [7]
  126.             },
  127.             'Loki': {
  128.                 '1C': [10, 10, 10, 10, 10],
  129.                 'Ruby': [10, 10, 10, 10, 10]
  130.             }
  131.         }
  132.         self.assertTrue(validate_data(data))
  133.  
  134.     def test_4(self):
  135.         data = {
  136.             'Anton': {
  137.                 'Python': [10, 9, 10],
  138.                 'Django': [10, 10, 10, 10],
  139.             },
  140.             'Alex': {
  141.                 'C': [9, 9],
  142.                 1: [8, 8, 10],
  143.                 'Assembler': [7]
  144.             },
  145.             'Loki': {
  146.                 '1C': [10, 10, 10, 10, 10],
  147.                 'Ruby': [10, 10, 10, 10, 10]
  148.             }
  149.         }
  150.         with self.assertRaises(TypeError):
  151.             validate_data(data)
  152.  
  153.     def test_5(self):
  154.         data = {
  155.             'Anton': {
  156.                 'Python': [10, 9, 10],
  157.                 'Django': [10, 5.5, 10, 10],
  158.             },
  159.             'Alex': {
  160.                 'C': [9, 9],
  161.                 'Java': [8, 8, 10],
  162.                 'Assembler': [7]
  163.             },
  164.             'Loki': {
  165.                 '1C': [10, 10, 10, 10, 10],
  166.                 'Ruby': [10, 10, 10, 10, 10]
  167.             }
  168.         }
  169.         with self.assertRaises(TypeError):
  170.             validate_data(data)
  171.  
  172.     def test_6(self):
  173.         data = {
  174.             'Anton': {
  175.                 'Python': [10, 9, 10],
  176.                 'Django': [10, True, 10, 10],
  177.             },
  178.             'Alex': {
  179.                 'C': [9, 9],
  180.                 'Java': [8, 8, 10],
  181.                 'Assembler': [7]
  182.             },
  183.             'Loki': {
  184.                 '1C': [10, 10, 10, 10, 10],
  185.                 'Ruby': [10, 10, 10, 10, 10]
  186.             }
  187.         }
  188.         with self.assertRaises(TypeError):
  189.             validate_data(data)
  190.  
  191.     def test_7(self):
  192.         data = {
  193.             'Anton': {
  194.                 'Python': [10, 9, 10],
  195.                 'Django': [10, False, 10, 10],
  196.             },
  197.             'Alex': {
  198.                 'C': [9, 9],
  199.                 'Java': [8, 8, 10],
  200.                 'Assembler': [7]
  201.             },
  202.             'Loki': {
  203.                 '1C': [10, 10, 10, 10, 10],
  204.                 'Ruby': [10, 10, 10, 10, 10]
  205.             }
  206.         }
  207.         with self.assertRaises(TypeError):
  208.             validate_data(data)
  209.  
  210.     def test_8(self):
  211.         data = {
  212.             'Anton': {
  213.                 'Python': [10, 9, 10],
  214.                 'Django': [10, 0, 10, 10],
  215.             },
  216.             'Alex': {
  217.                 'C': [9, 9],
  218.                 'Java': [8, 8, 10],
  219.                 'Assembler': [7]
  220.             },
  221.             'Loki': {
  222.                 '1C': [10, 10, 10, 10, 10],
  223.                 'Ruby': [10, 10, 10, 10, 10]
  224.             }
  225.         }
  226.         with self.assertRaises(ValueError):
  227.             validate_data(data)
  228.  
  229.     def test_9(self):
  230.         data = {
  231.             'Anton': {
  232.                 'Python': [10, 9, 10],
  233.                 'Dj@ngo': [10, 10, 10, 10],
  234.             },
  235.             'Alex': {
  236.                 'C': [9, 9],
  237.                 'Java': [8, 8, 10],
  238.                 'Assembler': [7]
  239.             },
  240.             'Loki': {
  241.                 '1C': [10, 10, 10, 10, 10],
  242.                 'Ruby': [10, 10, 10, 10, 10]
  243.             }
  244.         }
  245.         with self.assertRaises(ValueError):
  246.             validate_data(data)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement