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