Функция enumerate в Python 🐍
Поговорим сегодня о маленькой, но очень важной встроенной функции, имя которой enumerate
.
Что это и когда применять
Синтаксис
enumerate(iterable, start=0)
Описание
Функция enumerate()
возвращает объект enumerate
, который является итератором, создающим кортежи. Этот кортеж содержит счетчик от start
(который по-умолчанию равен 0) и значение, полученное в результате перебора по iterable
. Объект, переданный в iterable
, должен быть последовательностью, итератором или другим объектом, поддерживающим метод итератора __next__()
.
Параметры
iterable
По сути,iterable
— это любой объект, по которому можно пройтись в цикле (списки, строки, файлы и т.д.).start
Позволяет задать начальное значение счетчика, что полезно, если нумерация должна начинаться не с 0, а с другого числа.
Если вы когда-нибудь писали цикл for
и ловили себя на мысли: "Вот бы знать, на каком я сейчас шаге итерации", то enumerate
— это ваш новый лучший друг. Функция позволяет избавиться от необходимости инициировать и обновлять отдельную переменную-счётчик.
Примеры
1. Перебор по списку
- Создадим список
- Выведем каждый элемент с индексом без
enumerate
- Выведем каждый элемент с индексом с использованием
enumerate
Допустим, мы перебираем гипотетический шкаф с вещами и хотим знать номер каждой вещи, которую мы достали.
list_of_things_from_closet = ["толстовка", "футболка", "кепка", "шорты", "джинсы"] # Печатаем каждый элемент из списка с его индексом for i in range(len(list_of_things_from_closet)): # i + 1, т.к. в обычной жизни мы не считаем элементы с 0, а начинаем с единицы print(f"Вещь № {i + 1} - это {list_of_things_from_closet[i]}")
>>> Вещь № 1 - это толстовка >>> Вещь № 2 - это футболка >>> Вещь № 3 - это кепка >>> Вещь № 4 - это шорты >>> Вещь № 5 - это джинсы
Теперь попробуем реализовать ровно то же самое, но с помощью enumerate
:
for index, element in enumerate(list_of_things_from_closet, start=1): print(f"Вещь № {index} - это {element}")
Выглядит проще и более читаемо, не так ли?
Перейдем к более реальной задаче (хотя что может быть реальней, чем перебор шкафа с вещами?!)
2. Перебор по файлу с логами
Представим, что у нас есть файл с логами сервера, и нам нужно найти все строки, где упоминается ошибка (ключевое слово "ERROR"). При этом мы хотим знать номер строки, чтобы можно было быстро найти её в файле.
Создадим файл с логами
Для начала создадим текстовый файл server_logs.txt
с примером логов:
2025-01-25 18:00:00 INFO: Server started 2025-01-25 18:05:23 ERROR: Disk space low 2025-01-25 18:10:45 WARNING: High CPU usage 2025-01-25 18:15:10 ERROR: Failed to connect to database 2025-01-25 18:20:30 INFO: Backup completed successfully 2025-01-25 18:25:00 ERROR: User authentication failed
Откроем файл и обработаем его с помощью enumerate
Теперь напишем небольшую функцию, которая откроет этот файл, прочитает его построчно и с помощью enumerate
проверит, есть ли в строке ключевое слово. Если есть, выведем номер строки и само событие.
def get_logs_by_level(level: str, filename: str = 'server_logs.txt') -> None: # Открываем файл с логами with open(filename, 'r', encoding='utf-8') as file: # Итерируемся по строкам с помощью enumerate for line_number, line in enumerate(file, start=1): # Проверяем, есть ли в строке ключевое слово, соответствующее уровню лога "level" (регистр не учитываем) if level in line.upper(): # Выводим номер строки и само событие print(f"Строка {line_number}: {line.strip()}") # Попробуем напечатать только логи уровня Error: get_logs_by_level(level="ERROR") # Результат: # Строка 2: 2025-01-25 18:05:23 ERROR: Disk space low # Строка 4: 2025-01-25 18:15:10 ERROR: Failed to connect to database # Строка 6: 2025-01-25 18:25:00 ERROR: User authentication failed # А теперь напечатаем строки с ворнингами: get_logs_by_level(level="WARNING") # Результат: # Строка 3: 2025-01-25 18:10:45 WARNING: High CPU usage
Класс, все работает ровно так, как нам и хотелось.
Заключение
Функция enumerate
— это простой, но мощный инструмент, который помогает сделать код чище и читаемее. Она избавляет от необходимости вручную управлять индексами и делает итерацию по элементам более удобной. Кроме того, использование enumerate
делает код более безопасным, так как исключает риск ошибок, связанных с некорректным обновлением индексов вручную.