# Infinite sequences

suggest changeGenerators can be used to represent infinite sequences:

```
def integers_starting_from(n):
while True:
yield n
n += 1
natural_numbers = integers_starting_from(1)
```

Infinite sequence of numbers as above can also be generated with the help of `itertools.count`

. The above code could be written as below

`natural_numbers = itertools.count(1)`

You can use generator comprehensions on infinite generators to produce new generators:

```
multiples_of_two = (x * 2 for x in natural_numbers)
multiples_of_three = (x for x in natural_numbers if x % 3 == 0)
```

Be aware that an infinite generator does not have an end, so passing it to any function that will attempt to consume the generator entirely will have **dire consequences**:

`list(multiples_of_two) # will never terminate, or raise an OS-specific error`

Instead, use list/set comprehensions with `range`

(or `xrange`

for python < 3.0):

```
first_five_multiples_of_three = [next(multiples_of_three) for _ in range(5)]
# [3, 6, 9, 12, 15]
```

or use `itertools.islice()`

to slice the iterator to a subset:

```
from itertools import islice
multiples_of_four = (x * 4 for x in integers_starting_from(1))
first_five_multiples_of_four = list(islice(multiples_of_four, 5))
# [4, 8, 12, 16, 20]
```

Note that the original generator is updated too, just like all other generators coming from the same “root”:

```
next(natural_numbers) # yields 16
next(multiples_of_two) # yields 34
next(multiples_of_four) # yields 24
```

An infinite sequence can also be iterated with a `for`

-loop. Make sure to include a conditional `break`

statement so that the loop would terminate eventually:

```
for idx, number in enumerate(multiplies_of_two):
print(number)
if idx == 9:
break # stop after taking the first 10 multiplies of two
```

# Classic example - Fibonacci numbers

```
import itertools
def fibonacci():
a, b = 1, 1
while True:
yield a
a, b = b, a + b
first_ten_fibs = list(itertools.islice(fibonacci(), 10))
# [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
def nth_fib(n):
return next(itertools.islice(fibonacci(), n - 1, n))
ninety_nineth_fib = nth_fib(99) # 354224848179261915075
```