Solutions generators exercises

ex1: Python Students

 1# python_students.py
 2
 3class PythonStudents:
 4    
 5    def __init__(self):
 6        self._students = []
 7        self._populate_students()
 8
 9    def __iter__(self):
10        self.index = 0
11        return self
12
13    def __next__(self):
14        ri = self.index
15        self.index += 1
16        if self.index > len(self._students):
17            raise StopIteration()
18        return self._students[ri]
19    
20    def _populate_students(self):
21        names = ["Claus", "Anna", "Ben", "Diana", "Erik", "Fiona", "George", "Hannah", "Ivan", "Julia"]
22        numbers = [1234, 5678, 9101, 1121, 3141, 5161, 7181, 9202, 1222, 3242]
23
24        for i in range(10):
25            self._students.append(Student(names[i], numbers[i]))
26
27
28
29
30
31class Student:
32
33    def __init__(self, name, cpr):
34        self.name = name
35        self.cpr = cpr
36
37    @property
38    def name(self):
39            return self.__name
40
41    @name.setter
42    def name(self, name):
43            self.__name = name.capitalize()
44
45    def __add__(self, student):
46            return Student('Anna the daugther', 1234)
47
48    def __str__(self):
49            return f'{self.name}, {self.cpr}'
50
51    def __repr__(self):
52            return f'{self.__dict__}'

ex2: School of students

 1# school_of_students.py
 2
 3import random
 4import time
 5
 6def timer(func):
 7    def wrapper(*args):
 8        start = time.time()
 9        val = func(*args)
10        end = (time.time()) - start
11        print(f'Time elepsed: {end}')
12        return val
13    return wrapper
14
15names = ['John', 'Corey', 'Adam', 'Steve', 'Rick', 'Thomas']
16majors = ['Math', 'Engineering', 'CompSci', 'Arts', 'Business']
17
18@timer
19def people_list(num_people):
20    result = []
21    for i in range(num_people):
22        person = {
23            'id': i,
24            'name': random.choice(names),
25            'major': random.choice(majors)
26        }
27        result.append(person)
28    # return result
29
30@timer
31def people_generator(num_people):
32    for i in range(num_people):
33        person = {
34            'id': i,
35            'name': random.choice(names),
36            'major': random.choice(majors)
37        }
38        yield person
39
40
41
42
43
44
45
46
47
48
49
50
51

ex3: Range Mimic

 1# range_mimic.py
 2
 3# 1. Create a "clone" of the build in range() function.
 4
 5class range:
 6
 7    def __init__(self, *args):
 8        if len(args) == 1:
 9            self._start = 0
10            self._end = args[0]
11            self._step = 1
12        elif len(args) == 2:
13            self._start = args[0]
14            self._end = args[1]
15            self._step = 1
16        elif len(args) == 3:
17            self._start = args[0]
18            self._end = args[1]
19            self._step = args[2]
20
21    def __iter__(self):
22        self._i = self._start
23        return self
24
25    def __next__(self):
26        try:
27            if self._end > self._i:
28                self._tmp = self._i
29                self._i += self._step
30                return self._tmp
31            else:
32                raise StopIteration
33        except AttributeError:
34            raise TypeError('range method is not itterable')
35
36
37x = range(2, 12, 2)
38for i in x:
39    print(i)
40
41# or just:
42for i in range(2, 12, 2):
43    print(i)
44
45# 2. Now do the same, but use a generator function instead.
46def range(*args):
47    
48    if len(args) == 1:
49        start = 0
50        end = args[0]
51        step = 1
52    elif len(args) == 2:
53        start = args[0]
54        end = args[1]
55        step = 1
56    elif len(args) == 3:
57        start = args[0]
58        end = args[1]
59        step = args[2]
60    
61    count = start 
62    while count < end:
63        yield count
64        count += step
65
66
67
68