January 25

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


Мой telegram-канал, присоединяйтесь :)

⬇⬇⬇

https://t.me/python3_with_love