1.__getitem__的簡單用法:
當一個類中定義了getitem方法,那么它的實例對象便擁有了通過下標來索引的能力。
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]這樣的一個下標是沒問題的舷暮,不過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]