 # { Useful Python Modules. }

### Objectives

By the end of this chapter, you should be able to:

• Distinguish between the different types of imports
• Give examples of advanced data types provided by the `collections` module

Now that you know how to import, let's examine a few useful modules:

#### Random

The `random` module is quite useful for generating random values of all kinds:

```import random

random.randint(1,10) # generate a number between 1 and 10
random.randrange(4) # generate between 0 and 3
random.random() # generate a number between 0 and 1
```

Here's an example pulling just a single function, the `choice` function, which grabs an element at random from a list:

```from random import choice as c

c([1,2,3,4,5]) # run this line several times, you should see different elements get returned
```

#### Math

The `math` module provides access to many mathematical functions, including helpers for rounding, constants like `e` and `pi`, and trigonometric functions.

```import math

math.e # 2.718281828459045
math.pi # 3.141592653589793
math.floor(2.2) # 2
math.ceil(2.2) # 3
math.sqrt(16) # 4
math.pow(2,10) # 1024.0
```

### Collections

This is a built in module that provides alternatives to Python's built-in containers like `dict`, `list`, `set`, and `tuple`. Take a look at each one of these and see what they do.

#### Counter

```from collections import Counter

l = [1,1,2,3,3,4,4,5,5]
Counter(l) # see what this returns!

string = "aweosakjdsaldwjdwq"
Counter(string)

s = 'this is such a nice nice nice thing that is nice!'

c = Counter(s.split())

# Counter({'a': 1,
#          'is': 2,
#          'nice': 3,
#          'nice!': 1,
#          'such': 1,
#          'that': 1,
#          'thing': 1,
#          'this': 1})

c.items() # list of element,count tuples
c.clear() # clear all values
c.values() # see all values
```

#### Defaultdict

```from collections import defaultdict

regular_dict = dict(first=1)
regular_dict['first'] # 1
regular_dict['second'] # KeyError!

def default_value():
return "nothing"

d = defaultdict(default_value)
d['nice'] = "cool"
d['nice'] # "cool"
d['whoaaa'] # "nothing"
```

#### OrderedDict

An ordered dictionary remembers the order in which key-value pairs were added.

```from collections import OrderedDict

d = {}
d['one'] = 1
d['two'] = 2
d['three'] = 3
d['four'] = 4

for k,v in d.items():
print(k,v) # no order!

od = OrderedDict()
od['one'] = 1
od['two'] = 2
od['three'] = 3
od['four'] = 4

for k,v in od.items():
print(k,v) # order!
```

#### namedtuple

```from collections import namedtuple

t = (1,2,3)
t = 2

Person = namedtuple('Person', 'first_name last_name fav_color')
elie = Person('Elie', 'Schoppik', 'purple')
elie.fav_color # 'purple'
```

When you're ready, move on to Debugging and Modules Exercises