Basics


In [ ]:
class Number:
    def __init__(self, start):
        self.data = start
    def __sub__(self, other):
        return Number(self.data - other)

In [ ]:
X = Number(5)
Y = X - 3
Y.data

Indexing and slicing


In [ ]:
class Indexer:
    def __getitem__(self, index):
        return index ** 2

In [ ]:
X = Indexer()
X[2]

In [ ]:
for i in range(5):
    print(X[i], end=' ')

Intercepting the Slices


In [ ]:
L = [5, 6, 7, 8, 9]

In [ ]:
L[2:4]

In [ ]:
L[1:]

In [ ]:
L[:-1]

In [ ]:
L[::2]

In [ ]:
L[slice(2, 4)]

In [ ]:
L[slice(1, None)]

In [ ]:
L[slice(None, -1)]

In [ ]:
L[slice(None, None, 2)]

In [ ]:
class Indexer:
    data = [5, 6, 7, 8, 9]
    def __getitem__(self, index):
        print('getitem: ', index)
        return self.data[index]

In [ ]:
X = Indexer()

In [ ]:
X[0]

In [ ]:
X[1]

In [ ]:
X[-1]

In [ ]:
X[2:4]

In [ ]:
X[1:]

In [ ]:
X[:-1]

In [ ]:
X[::2]

In [ ]:
class Indexer:
    def __getitem__(self, index):
        if isinstance(index, int):
            print('indexing', index)
        else:
            print('slicing', index.start, index.stop, index.step)

In [ ]:
X = Indexer()
X[99]

In [ ]:
X[1:99:2]

In [ ]:
X[1:]

Index iteration


In [ ]:
class StepperIndex:
    def __getitem__(self, i):
        return self.data[i]

In [ ]:
X = StepperIndex()
X.data = 'Spam'
X[1]

In [ ]:
for item in X:
    print(item, end=' ')

In [ ]:
'p' in X

In [ ]:
[c for c in X]

In [ ]:
list(map(str.upper, X))

In [ ]:
(a, b, c, d) = X
a, c, d

In [ ]:
list(X), tuple(X), ' '.join(X)

In [ ]:
X

In [ ]: