Solutions generators exercises

ex1: Python Students

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# python_students.py

class PythonStudents:
    
    def __init__(self):
        self.students = []

    def __add__(self, student):
        self.students.append(student)

    def __iter__(self):
        self.index = 0
        return self

    def __next__(self):
        ri = self.index
        self.index += 1
        if self.index > len(self.students):
            raise StopIteration()
        return self.students[ri]



class Student:

    def __init__(self, name, cpr):
        self.name = name
        self.cpr = cpr

    @property
    def name(self):
            return self.__name

    @name.setter
    def name(self, name):
            self.__name = name.capitalize()

    def __add__(self, student):
            return Student('Anna the daugther', 1234)

    def __str__(self):
            return f'{self.name}, {self.cpr}'

    def __repr__(self):
            return f'{self.__dict__}'

ex2: School of students

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# school_of_students.py

import random
import time

def timer(func):
    def wrapper(*args):
        start = time.time()
        val = func(*args)
        end = (time.time()) - start
        print(f'Time elepsed: {end}')
        return val
    return wrapper

names = ['John', 'Corey', 'Adam', 'Steve', 'Rick', 'Thomas']
majors = ['Math', 'Engineering', 'CompSci', 'Arts', 'Business']

@timer
def people_list(num_people):
    result = []
    for i in range(num_people):
        person = {
            'id': i,
            'name': random.choice(names),
            'major': random.choice(majors)
        }
        result.append(person)
    # return result

@timer
def people_generator(num_people):
    for i in range(num_people):
        person = {
            'id': i,
            'name': random.choice(names),
            'major': random.choice(majors)
        }
        yield person













ex3: Range Mimic

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# range_mimic.py

# 1. Create a "clone" of the build in range() function.

class MyRange:

    def __call__(self, *args):
        if len(args) == 1:
            self.start = 0
            self.end = args[0]
            self.step = 1
        elif len(args) == 2:
            self.start = args[0]
            self.end = args[1]
            self.step = 1
        elif len(args) == 3:
            self.start = args[0]
            self.end = args[1]
            self.step = args[2]
        return iter(self)

    def __iter__(self):
        self.i = self.start
        return self

    def __next__(self):
        try:
            if self.end > self.i:
                self.tmp = self.i
                self.i += self.step
                return self.tmp
            else:
                raise StopIteration
        except AttributeError:
            raise TypeError('range method is not itterable')


my_range = MyRange()
x = my_range(2, 12, 2)
for i in x:
    print(i)


# 2. Now do the same, but use a generator function instead.
def my_range_gen(start, stop, step):
    r = MyRange()
    for i in r(start, stop, step):
        yield i