# Chapter 7 Exercise Set 0: Chapter Review¶

## Doctest Exercises¶

In each of the following exercises, write Python code to make the doctests pass.

1. ```class Foo:
"""
>>> foo = Foo(42, 'eggs')
>>> foo.num
42
>>> foo.food
'eggs'
>>> foo.message()
'I love eggs!'
"""
```
2. ```class Bar:
"""
>>> bar = Bar()
>>> bar.this
'Ni!'
>>> bar.that
'shrubbery'
>>> bar.speak(2)
'Ni! Ni!'
>>> bar.speak(5)
'Ni! Ni! Ni! Ni! Ni!'
"""
```
3. ```class Seqtools:
"""
>>> myseq = Seqtools([1, 2, 'a', 7, ('x', 'y'), 'yup', 11.3, True])
>>> myseq.data
[1, 2, 'a', 7, ('x', 'y'), 'yup', 11.3, True]
>>> myseq.nums()
[1, 2, 7, 11.3]
>>> myseq.seqs()
['a', ('x', 'y'), 'yup']
>>> myseq.others()
[True]
"""
```

## Point¶

### `distance(p1, p2)`¶

Write a `distance` function that takes two `Point`s as parameters and returns the distance between them. It should pass the following doctests:

```def distance(p1, p2):
"""
>>> p1 = Point(1, 2)
>>> p2 = Point(4, 6)
>>> distance(p1, p2)
5.0
>>> p3 = Point(16, 11)
>>> distance(p2, p3)
13.0
"""
```

Rewrite your `distance` function as a method inside the `Point` class. The new doctests should look like this:

```def distance(self, other):
"""
>>> p1 = Point(1, 2)
>>> p2 = Point(4, 6)
>>> p1.distance(p2)
5.0
>>> p3 = Point(16, 11)
>>> p2.distance(p3)
13.0
"""
```

Note

Add this method to a module named `point.py` that contains the complete `Point` class as described in the chapter.

## Time¶

### Printing `Time`s¶

Rewrite the `print_time` method from the chapter so that it overloads the built-in `print` function and add it to the `Time` class described in the chapter in a module named `my_time.py`. Be sure your new method returns a string instead of calling `print`.

Once you are finished, you should be able to import your class and do the following:

```>>> from my_time import Time
>>> t = Time(9, 30, 0)
>>> print(t)
9:30:00
```

### `increment`¶

Rewrite the `increment` method so that it doesn’t contain any loops.

Now rewrite `increment` as a pure function, and write method calls to both versions.

### `convert_to_seconds`¶

Convert the function `convert_to_seconds`:

```def convert_to_seconds(t):
minutes = t.hours * 60 + t.minutes
seconds = minutes * 60 + t.seconds
return seconds
```

to a method in the `Time` class.

## `find`¶

Add a fourth parameter, `end`, to the `find` function that specifies where to stop looking. Warning: This exercise is a bit tricky. The default value of `end` should be `len(str)`, but that doesn’t work. The default values are evaluated when the function is defined, not when it is called. When `find` is defined, `str` doesn’t exist yet, so you can’t find its length.

## `NumberSet`¶

Fill in the class `NumberSet` with data attributes and methods to make the doctests pass.

```class NumberSet:
"""
>>> nums = NumberSet([2, 4, 6])
>>> print(nums)
[2, 4, 6]
>>> nums.mean()
4.0
>>> nums.median()
4
>>> nums.mode()
[2, 4, 6]
>>> nums2 = NumberSet([1, 2, 6, 6])
>>> nums2.mean()
3.75
>>> nums2.median()
4.0
>>> nums2.mode()

>>> numset = [3, 5, 19, 42, 5, 42, 11]
>>> nums3 = NumberSet(numset)
>>> nums3.numlist
[3, 5, 5, 11, 19, 42, 42]
>>> numset
[3, 5, 19, 42, 5, 42, 11]
>>> round(nums3.mean())
18
>>> nums3.median()
11
>>> nums3.mode()
[5, 42]
"""
```