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) см.