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