In [56]:
import itertools
import sys

class FibonacciSeries(object):
    def __iter__(self):
        p1 = 1
        p2 = 1
        yield p1
        yield p2
        while True:
            if p2 > sys.maxint - p1:
                return
            p3 = p1 + p2
            yield p3
            p1, p2 = p2, p3
    def __contains__(self, n):
        for i in self:
            if i == n:
                return True
            if i > n:
                return False
    def __getitem__(self, item):
        if isinstance(item, slice):
            print 'slicing fib'
            return list(itertools.islice(self, item.start, item.stop, item.step))
        else:
            print 'indexing fib'
            return itertools.islice(self, item, item+1).next()

In [58]:
f = FibonacciSeries()

In [47]:
l = list(f)
l[10]


Out[47]:
89

In [60]:
from itertools import islice

f[10]


indexing fib
Out[60]:
89