Separate iterable containers from iterator objects that carry a current position.
What You Will Learn
An iterable can provide an iterator; an iterator remembers where it is and returns itself from iter(). Calling next() consumes one value. A list can be traversed repeatedly because it creates new iterators, while an exhausted list_iterator does not restart automatically.
Many iterator tools are lazy. Creating the iterator does not necessarily perform the work; advancing it can consume the original source.
Step-by-Step Example
The example below makes the behavior visible with small input values that you can change safely.
values = [10, 20, 30]
iterator = iter(values)
print(next(iterator))
print(next(iterator))
print(list(iterator))
print(list(values))
How the Example Works
- The variable values holds the result of [10, 20, 30]. Later lines use that value or inspect how it changes.
- The variable iterator holds the result of iter(values). Later lines use that value or inspect how it changes.
- The print() calls make the return values or state visible so you can compare them with the explanation and check your prediction.
Expected output from the example:
10
20
[30]
[10, 20, 30]
When You Would Use This
This pattern is useful in readers for CSV files, event streams, or paginated API results, where collecting everything in memory is unnecessary. Because iterator state advances when values are consumed, decide whether you need a reusable collection or a one-time pass. Keep files and connections open until their lazy consumers finish.
Practice: Modify the Code
Create two independent iterators over the same list and advance them at different speeds.
Verify the changed output against the behavior described above, including the relevant invalid or boundary case.
For complete parameters and version details, consult the official Python documentation.
Common Beginner Mistakes
- Assuming calling iter() on an exhausted iterator resets it to the beginning.
- Treating every iterable as a sequence that supports indexing and len().
Key Takeaways
- Separate iterable containers from iterator objects that carry a current position.
- An iterable can provide an iterator; an iterator remembers where it is and returns itself from iter().
- Apply this operation only after checking the assumptions and input conditions shown in the example.