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