The built-in function that returns an enumerate object yielding pairs of index and item is `enumerate`. It is designed for loops that need both a sequence’s position and the value at that position.
For example, `enumerate(['red', 'blue'])` produces pairs equivalent to `(0, 'red')` and `(1, 'blue')`. The usual pattern is `for index, item in enumerate(items):`, which is clearer and safer than manually maintaining a counter. An optional `start` argument changes the initial index: `enumerate(items, start=1)` begins numbering at 1.
A frequent mistake is choosing `range`, which produces numbers, or `zip`, which combines multiple iterables. `iter` creates an iterator from an iterable but does not add indexes. The enumerate object is lazy: it generates each pair as iteration proceeds rather than immediately constructing a complete list. This makes it useful for large sequences and ordinary `for` loops alike.