Функция 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 делает код более безопасным, так как исключает риск ошибок, связанных с некорректным обновлением индексов вручную.