v1.0.0

Python с нуля для ЕГЭ · Отмечаем выполненное, редактируем и удаляем

Урок курсаPython 35 задачБесплатно

Отмечаем выполненное, редактируем и удаляем

Добавим выбор дела по номеру, отметку выполнения, редактирование и удаление.

Теория

Как выбрать нужное дело

Добавлять дела мы уже умеем. Теперь пользователь вводит номер и ждёт, что программа изменит именно выбранную запись. Индекс списка для этого не подходит: после удаления он может поменяться. Поэтому ищем дело по его id.

def find_task(task_id):    for task in tasks:        if task["id"] == task_id:            return task    return None

Если номер найден, функция возвращает словарь из списка. Поэтому присваивание вроде task["done"] = True меняет не копию, а то самое дело, которое затем покажет list.

Один поиск — три действия

Разберём на примере
Отмечаем дело номер 2
В tasks есть словарь с id 2 и done равным False.
  1. find_task(2) перебирает tasks и находит словарь с номером 2.
  2. Поскольку дело найдено, проверка task is None не завершает функцию.
  3. Строка task["done"] = True ставит отметку выполнения.
  4. При следующей команде list рядом с делом появляется x.
def complete_task():    task_id = int(input("Номер дела: "))    task = find_task(task_id)    if task is None:        print("Дело не найдено")        return    task["done"] = True
Проверьте себя
Зачем проверять task is None до изменения словаря?
Поиск может ничего не вернуть; у None нет полей title или done.

Почему номера не меняются после удаления

Удалённое дело исчезает, но номера остальных записей не трогаем. Иначе команда, которая ещё минуту назад относилась к делу 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("Неизвестная команда")
Как действовать
Проверяем каждое действие
  1. Добавьте три дела. Убедитесь, что номера различаются.
  2. Отметьте второе. В списке должна появиться отметка x.
  3. Измените первое. Номер остаётся прежним, меняется только title.
  4. Удалите второе. Третье дело не должно получить новый номер.
  5. Запросите неизвестный id. Программа сообщает, что дело не найдено.
Проверьте себя
Почему изменение task["title"] видно при следующем обходе списка tasks?
find_task возвращает ссылку на тот же изменяемый словарь, который хранится внутри списка.

Практика

Что возвращает поиск без результата

Что вернёт find_task, если дела с указанным id нет в списке?

Подсказка
В Python есть отдельное значение для отсутствующего результата.
Решение

После завершения цикла без совпадения функция возвращает None.

Что меняет команда done

Какое значение получает поле done, когда пользователь отмечает дело выполненным?

Подсказка
После этой команды условие task["done"] должно быть истинным.
Решение

complete_task меняет поле done на True.

Что меняется при редактировании

Какое поле меняет команда edit, пока id дела остаётся прежним?

Подсказка
Именно это поле пользователь видит как текст дела.
Решение

Команда edit меняет title, а id дела остаётся прежним.

Как удалить найденное дело

Какой метод списка удаляет словарь task, который уже вернула функция поиска?

Подсказка
Методу передаётся сам словарь, а не его индекс.
Решение

Вызов tasks.remove(task) удаляет найденный словарь из списка.

Какой номер будет следующим

Добавьте три дела с id 1, 2, 3, удалите второе и добавьте ещё одно. Какой id получит новое дело?

Подсказка
Удаление дела не уменьшает next_id.
Решение

После трёх добавлений next_id равен 4; удаление его не меняет.

Итог

Теперь список можно не только пополнять. Программа находит дело по номеру, отмечает его выполненным, меняет текст и удаляет запись.

Пока данные живут только до закрытия программы. Следующий шаг — записать именно этот список в файл и восстановить его при новом запуске.

Прогресс

0 / 5
x

Вы ещё не решали задания