# The Iterator Protocol — Python

Source: https://www.geekswithgeeks.com/en/python/py-iterators

> What actually happens when a `for` loop asks "what's next?"

## Iterable vs iterator

An **iterable** has `__iter__` (returns an iterator). An **iterator** has `__next__` (returns the next value, or raises `StopIteration`).

## Manually driving an iterator

`for x in seq:` is really: get an iterator, keep calling `next()`, stop on `StopIteration`. You can drive it manually too.

```python
nums = [10, 20, 30]
it = iter(nums)
print(next(it))   # 10
print(next(it))   # 20
print(next(it))   # 30
# next(it)        # StopIteration
```
