Python定制類:__getitem__和slice切片

1.__getitem__的簡單用法:

當(dāng)一個類中定義了getitem方法,那么它的實例對象便擁有了通過下標(biāo)來索引的能力。

class A(object):
    def __getitem__(self, item):
        return item

a = A()
print(a[5], a[12])

執(zhí)行結(jié)果:

5 12

2.用getitem實現(xiàn)斐波那契數(shù)列:

class Fib(object):
    def __getitem__(self, item):
        if item == 0 or item == 1:
            return 1
        else:
            a, b = 1, 1
            for i in range(item - 1):
                a, b = b, a+b
            return b

fib = Fib()
for i in range(10):
    print(fib[i])

執(zhí)行結(jié)果:

1
1
2
3
5
8
13
21
34
55

3.slice切片

我們發(fā)現(xiàn)上個程序fib[2]這樣的一個下標(biāo)是沒問題的,不過fib[3:5]這樣的切片的話是會報錯的。所以我們先了解下什么是切片。

# slice用法:
# slice(stop)
# slice(start, stop, step) 

>>> a = slice(10)
>>> print(a)
slice(None, 10, None)

>>> a = slice(1,10,2)
>>> print(a)
slice(1, 10, 2)

>>> print(a.start)
1

>>> print(a.stop)
10

>>> print(a.step)
2

>>> li = [1,2,3,4,5,6,7,8,9,0]
>>> li[slice(2,6)]
[3, 4, 5, 6]

#是的。li[slice(2,6)] 就等于 li[2:6]

給斐波那契數(shù)列完成slice切片:

class Fib(object):
    def __getitem__(self, item):
        if isinstance(item, slice):
            print(item.start)
            print(item.stop)

            stop = item.stop
            if item.stop is None:
                stop = 100

            re_list = []

            a, b = 0, 1
            for i in range(stop):
                a, b = b, a + b
                re_list.append(a)

            return re_list[item.start:stop:item.step]

        elif item == 0 or item == 1:
            return 1
        else:
            a, b = 1, 1
            for i in range(item - 1):
                a, b = b, a+b
            return b

fib = Fib()
print(fib[1:20:2])

輸出結(jié)果:

1
20
[1, 3, 8, 21, 55, 144, 377, 987, 2584, 6765]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容