Какова информация о реализации для перечисления?

Python имеет enumerate() для итерации по объектам с индексом. Я сомневаюсь, что интерпретаторы создают множество объектов int с единственной целью отслеживать, где это происходит. На странице PEP говорится следующее, но я не совсем понимаю, что происходит под капотом:

Он предоставляет все повторители с тем же преимуществом, что iteritems () предоставляет словари – компактную, удобочитаемую и надежную индексную нотацию.

Так в чем тут волшебство?

    enumerate() – итератор; он только производит значение индекса int на лету ; он не производит их всех впереди.

    Вы можете попробовать прочитать исходный код enumobject.c , но в основном это можно перевести на Python следующим образом:

     def enumerate(iterable, start=0): count = start for elem in iterable: yield count, elem count += 1 

    Ключевое слово yield делает это генераторной функцией , и вам нужно зацикливать генератор (или вызвать next() на нем), чтобы продвинуть функцию для создания данных, один yield вызова за раз.

    Python также ставит значения int , все значения между -5 и 256 (включительно) являются одиночными, поэтому приведенный выше код даже не создает новые объекты int пока вы не достигнете 257.

    Это помогает вам знать, где вещи …

     l = ['apple', 'banana', 'cabbage'] for idx, item in enumerate(l): print "the item: %s, is at position %s" % (item, idx) >>> the item: apple, is at position 0 the item: banana, is at position 1 the item: cabbage, is at position 2 

    Это помогает в следующем сценарии. Представьте, что вы хотите найти каждый элемент «капусты» в списке. И знай их индексы.

     l = ['apple', 'banana', 'cabbage', 'monkey', 'kangaroo', 'cabbage'] def find_indexes(lst, match): results = [] for idx, item in enumerate(l): if item == match: results.append(idx) return results print find_indexes(l, 'cabbage') >>> [2, 5]