Теория
Как выбрать нужное дело
Добавлять дела мы уже умеем. Теперь пользователь вводит номер и ждёт, что программа изменит именно выбранную запись. Индекс списка для этого не подходит: после удаления он может поменяться. Поэтому ищем дело по его id.
def find_task(task_id): for task in tasks: if task["id"] == task_id: return task return NoneЕсли номер найден, функция возвращает словарь из списка. Поэтому присваивание вроде task["done"] = True меняет не копию, а то самое дело, которое затем покажет list.
Один поиск — три действия
- find_task(2) перебирает tasks и находит словарь с номером 2.
- Поскольку дело найдено, проверка task is None не завершает функцию.
- Строка task["done"] = True ставит отметку выполнения.
- При следующей команде list рядом с делом появляется x.
def complete_task(): task_id = int(input("Номер дела: ")) task = find_task(task_id) if task is None: print("Дело не найдено") return task["done"] = TrueПочему номера не меняются после удаления
Удалённое дело исчезает, но номера остальных записей не трогаем. Иначе команда, которая ещё минуту назад относилась к делу 3, внезапно выберет другое дело. Новый номер по-прежнему берём из next_id, а не из длины списка.
Собираем вторую версию
Добавьте новые функции в предыдущий файл или сравните свою версию с кодом ниже. Пока есть известная слабость: слово вместо номера вызовет ValueError. Не отвлекаемся на неё сейчас — в последнем уроке вернёмся к вводу и применим try.
tasks = []next_id = 1 def find_task(task_id): for task in tasks: if task["id"] == task_id: return task return None def show_tasks(): if not tasks: print("Список пока пуст") return for task in tasks: mark = "x" if task["done"] else " " print(f'[{mark}] {task["id"]}. {task["title"]}') def add_task(): global next_id title = input("Новое дело: ").strip() if title: tasks.append({"id": next_id, "title": title, "done": False}) next_id += 1 def complete_task(): task = find_task(int(input("Номер дела: "))) if task is None: print("Дело не найдено") return task["done"] = True def edit_task(): task = find_task(int(input("Номер дела: "))) if task is None: print("Дело не найдено") return title = input("Новый текст: ").strip() if title: task["title"] = title def delete_task(): task = find_task(int(input("Номер дела: "))) if task is None: print("Дело не найдено") return tasks.remove(task) while True: command = input("Команда: ").strip().lower() if command == "list": show_tasks() elif command == "add": add_task() elif command == "done": complete_task() elif command == "edit": edit_task() elif command == "delete": delete_task() elif command == "exit": break else: print("Неизвестная команда")- Добавьте три дела. Убедитесь, что номера различаются.
- Отметьте второе. В списке должна появиться отметка x.
- Измените первое. Номер остаётся прежним, меняется только title.
- Удалите второе. Третье дело не должно получить новый номер.
- Запросите неизвестный id. Программа сообщает, что дело не найдено.
Практика
Что возвращает поиск без результата
После завершения цикла без совпадения функция возвращает None.
Что меняет команда done
complete_task меняет поле done на True.
Что меняется при редактировании
Команда edit меняет title, а id дела остаётся прежним.
Как удалить найденное дело
Вызов tasks.remove(task) удаляет найденный словарь из списка.
Какой номер будет следующим
После трёх добавлений next_id равен 4; удаление его не меняет.
Итог
Теперь список можно не только пополнять. Программа находит дело по номеру, отмечает его выполненным, меняет текст и удаляет запись.
Пока данные живут только до закрытия программы. Следующий шаг — записать именно этот список в файл и восстановить его при новом запуске.
Прогресс
0 / 5Вы ещё не решали задания