Colab

supporting slices in MyRange class

note that the MyRange class in lecture 04 does not support slices

range10 = MyRange(10)
range10[::2]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-2886954a11eb> in <module>
      8 
      9 range10 = MyRange(0, 10)
---> 10 list(range10[::2])

<ipython-input-2-25399ac18a9d> in __getitem__(self, offset)
     13 
     14     def __getitem__(self, offset):
---> 15         if self.__n <= offset:
     16             raise IndexError('range object index out of range')
     17 

TypeError: '<=' not supported between instances of 'int' and 'slice'

create a new class MyRange2 that inherits from MyRange and adds support of slices

HINT: use the class islice from the module itertools

expected output:

  >>> range10 = MyRange2(0, 10)
  >>> list(range10[::2])
  [0, 2, 4, 6, 8]
### useful starting point
import collections.abc
import math
class MyRange(collections.abc.Sequence):
    def __init__(self, start, stop, step=1):
        self.__start = start
        self.__stop = stop
        self.__step = step
        self.__n = max(0, math.ceil((stop-start) / step))
        super().__init__()
        
    def __len__(self):
        return self.__n
    
    def __getitem__(self, offset):
        if self.__n <= offset:
            raise IndexError('range object index out of range')
            
        return self.__start + offset * self.__step
    
    def __repr__(self):
        return f"{type(self).__name__}({self.__start},{self.__stop},{self.__step})"


3x3 matrix

Write a class called Matrix that represents a simple 3x3 matrix.

namely it should support the following operations: you do not need to derive from any ABC

>>> m = Matrix()
>>> print(m)
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]

>>> m[0,0] = 10
>>> print(m)
[10, 0, 0]
[0, 0, 0] 
[0, 0, 0]

>>> m[1,1] = 100
>>> m[1,1]
100