7.5. Самостоятельная работа

Примечание

При выполнении заданий используйте заготовки решений: -> Репозиторий.

Подробнее: см. Цикл выполнения и защиты заданий.

7.5.1. Комплексная задача

№7.5.1

Продолжите решение задачи № 6.5.1.

Используя результаты предыдущего решения, а также заготовку и Листинг 7.5.1, в строках документации укажите возбуждаемые исключения (если функция их возбуждает), а также дополните код по их обработке.

Листинг 7.5.1 - Пример решения с обработкой исключений
  1"""Комплексная задача.
  2
  3Сложность: O(N).
  4"""
  5
  6# Это пример кода, он может быть произвольно усложнен
  7# в рамках ограничений темы
  8#
  9# Требования:
 10#
 11# - в строках документации укажите исключения, если функция их возбуждает;
 12# - добавьте обработку исключений.
 13
 14
 15# Замените атрибуты словаря и др. на соответствующие своему варианту
 16
 17def load_db():
 18    """Загрузить данные.
 19
 20    Результат: list of dict.
 21
 22    Сложность: O(1).
 23    """
 24    db = [
 25        {
 26            "name": "Иванов Иван",
 27            "birthday": "01/12/2000",
 28            "height": 170,
 29            "weight": 70.5,
 30            "car": True,
 31            "languages": ["С++", "Python"]
 32        },
 33
 34        ...
 35    ]
 36    return db
 37
 38
 39def print_employee(item):
 40    """Вывести объект 'item' на экран со всеми атрибутами.
 41
 42    Сложность: O(1).
 43    """
 44    print("Имя: {}".format(i, item["name"]))
 45
 46    ...
 47
 48
 49def employees_filter(db, lang):
 50    """Вернуть отфильтрованную базу 'db' (список сотрудников), у которых
 51    в качестве языка программирования имеется 'lang'.
 52
 53    Аргументы:
 54        - db (list of dict): база данных;
 55        - lang (str): язык программирования.
 56
 57    Результат:
 58        - (list of dict): отфильтрованная база данных.
 59
 60    Сложность: O(N).
 61    """
 62    # res - копия db, с сотрудниками, удовлетворяющими условию по языку
 63    res = []
 64    for item in db:
 65        if lang in item["languages"]:
 66            res.append(item)
 67
 68    return res
 69
 70
 71def employee_employee_avg_height(db, younger_than):
 72    """Вернуть средний рост среди сотрудников 'db', у которых
 73    год рождения не менее 'younger_than'.
 74
 75    Аргументы:
 76        - db (list of dict): база данных;
 77        - younger_than (int): минимальный год рождения.
 78
 79    Результат:
 80        - (float): если такие сотрудники есть;
 81          (None): если таких сотрудников нет.
 82
 83    Исключения:
 84        - ValueError: если кол-во найденных сотрудников равно 0.
 85
 86    Сложность: O(N).
 87    """
 88
 89    r_sum = 0
 90    r_col = 0
 91    for item in db:
 92        year = int(item["birthday"][-4:])
 93        if year >= younger_than:
 94            r_sum += item["height"]
 95            r_col += 1
 96
 97    if r_col == 0:
 98        raise ValueError
 99
100    return r_sum / r_col
101
102
103db = load_db()
104while True:
105
106    try:
107        print("\n-----")
108        print("Меню")
109        print("-----")
110        print("1. Список сотрудников.")
111        print("2. Фильтр по языку программирования.")
112        print("3. Средний рост сотрудников, моложе указанного г.р.")
113        print("\nВыберите пункт меню или нажмите ENTER для выхода: ", end="")
114
115        answer = input()
116
117        if answer == "1":
118            print("Содержимое базы данных ({}):".format(len(db)))
119            for i, item in enumerate(db, start=1):
120                print("{}.".format(i))
121                print_employee(item)
122
123        elif answer == "2":
124            lang = input("Введите язык программирования: ")
125            # "Нормализация" наименования языка на случай ошибки при вводе
126            lang = lang.capitalize()
127
128            res = employees_filter(db, lang)
129
130            if len(res) > 0:
131                print("Список сотрудников со знанием "
132                      "языка программирования {} ({}):".format(lang, len(res)))
133                for i, item in enumerate(res, start=1):
134                    print("{}.".format(i))
135                    print_employee(item)
136            else:
137                print("Таких сотрудников нет.")
138
139        elif answer == "3":
140            try:
141                younger_than = int(input("Введите год рождения сотрудника: "))
142
143                res = employee_employee_avg_height(db, younger_than)
144
145                try:
146                    print("Средний рост сотрудников, {} г.р. и моложе: "
147                          "({:.1f}) см.".
148                          format(younger_than, res))
149                except ValueError:
150                    print("Таких сотрудников нет.")
151            except ValueError:
152                print("Год рождения должен быть целым числом.")
153
154        else:
155            break
156
157    except Exception as err:
158        print("Произошла ошибка!")
159        print("Тип:", type(err))
160        print("Описание:", err)
161
162
163# --------------
164# Пример вывода:
165#
166# -----
167# Меню
168# -----
169# 1. Список сотрудников.
170# 2. Фильтр по языку программирования.
171# 3. Средний рост сотрудников, моложе указанного г.р.
172#
173# Выберите пункт меню или нажмите ENTER для выхода: 1
174# Содержимое базы данных (3):
175# 1.
176# Имя: Иванов Иван
177# День рождения: 01/12/2000
178# Рост (см.): 170
179# Вес (кг.): 70.5
180# Есть машина: True
181# Языки программирования: ['С++', 'Python']
182# 2.
183# Имя: Сергеев Сергей
184# День рождения: 01/06/2001
185# Рост (см.): 180
186# Вес (кг.): 110.4
187# Есть машина: False
188# Языки программирования: ['Pascal', 'Delphi']
189# 3.
190# Имя: Николаева Мария
191# День рождения: 14/07/1998
192# Рост (см.): 180
193# Вес (кг.): 66.9
194# Есть машина: True
195# Языки программирования: ['C#', 'C++', 'C']
196#
197# -----
198# Меню
199# -----
200# 1. Список сотрудников.
201# 2. Фильтр по языку программирования.
202# 3. Средний рост сотрудников, моложе указанного г.р.
203#
204# Выберите пункт меню или нажмите ENTER для выхода: 2
205# Введите язык программирования: Python
206# Список сотрудников со знанием языка программирования Python (1):
207# 1.
208# Имя: Иванов Иван
209# День рождения: 01/12/2000
210# Рост (см.): 170
211# Вес (кг.): 70.5
212# Есть машина: True
213# Языки программирования: ['С++', 'Python']
214#
215# -----
216# Меню
217# -----
218# 1. Список сотрудников.
219# 2. Фильтр по языку программирования.
220# 3. Средний рост сотрудников, моложе указанного г.р.
221#
222# Выберите пункт меню или нажмите ENTER для выхода: 3
223# Введите год рождения сотрудника: 2000
224# Средний рост сотрудников, 2000 г.р. и моложе: (175.0) см.