## The itertools module

The **itertools** module is a module in the standard Python library that contains many functions that are very useful in functional programming, especially in iterations.

- The
**count()**function starts counting from a certain value. - The
**cycle()**function performs an infinite iteration on an iterable object - The
**repeat()**function repeats an object, either infinte times or for a given value of times.

Let’s see an example

```
from itertools import count
for i in count(4):
if i > 10:
break
print(i)
```

if you run it, you get:

```
>>>
4
5
6
7
8
9
10
```

## Other Functions

There are other functions within the module that work similar to map () and filter ().

**takewhile ()**– takes the elements of an iterable object as long as a predicate function remains True**chain ()**– combines various iterable objects into one iterable object**accumulate ()**– returns the total number of values in an iterable object.

Let’s see an example

```
from itertools import accumulate, takewhile, chain
lista1 = list(accumulate(range(7)))
print(lista1)
lista2 = list(takewhile(lambda x: x<5, lista1))
print(lista2)
print(list(chain(lista1,lista2)))
```

eseguendo

```
>>>
[0, 1, 3, 6, 10, 15, 21]
[0, 1, 3]
[0, 1, 3, 6, 10, 15, 21, 0, 1, 3]
```

## Combinatorial functions

There are combinatorial functions in the itertools module as **product()** and **permutation()**. These functions are very useful when you want to get all the possible combinations of the elements.

```
from itertools import permutations, product
chars = ("A","B","C")
products = list(product(chars,chars))
combinations = list(permutations(lettere))
print(products)
print(combinations)
```

if you run it, you get

```
>>>
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
```