In Python, a generator is a special type of function that can be used to create iterable sequences of values on-the-fly. Unlike regular functions, which compute and return a value immediately, generators can generate a sequence of values over time, using the yield keyword.

Example: The following `fib`

function is a generator function that generates a sequence of Fibonacci numbers up to a given limit index `n`

.

```
def fib(n):
a = [0, 1]
i = 0
while i <= n:
yield a[i%2]
a[i%2] = a[0] + a[1]
i += 1
```

The `yield`

keyword is used to return each generated Fibonacci number as it is generated, which makes the function a generator.

Use `next`

to get each number:

```
>>> f=fib(5)
>>> next(f)
0
>>> next(f)
1
>>> next(f)
1
>>> next(f)
2
>>> next(f)
3
>>> next(f)
5
>>> next(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
```