直接上代码
class Fib(object):
def __init__(self):
self.__a, self.__b = 0, 1
# 返回迭代对象
def __iter__(self):
return self
# 返回迭代对象的下一个值
def __next__(self):
self.__a, self.__b = self.__b, self.__a + self.__b
# 结束条件 否则就成了无限数列
if self.__a > 10000:
raise StopIteration()
return self.__a
# 返回索引值或切片
def __getitem__(self, item):
if isinstance(item, int):
for i in range(item):
self.__a, self.__b = self.__b, self.__a + self.__b
return self.__a
elif isinstance(item, slice):
start, stop, step = item.start, item.stop, item.step
if step is 0:
raise ValueError('Slice step cannot be zero')
# 设置default值
# 所有的 24 均为该实例的长度
start = 0 if start is None else start
stop = 24 if stop is None else stop
step = 1 if step is None else step
result = []
# 转化负值
start = 24 + start if start < 0 else start
stop = 24 + stop if stop < 0 else stop
# 计算初步结果
for i in range(stop):
self.__a, self.__b = self.__b, self.__a + self.__b
if i >= start:
result.append(self.__a)
# 根据step值返回最终结果
finally_result = []
first, end = 0, len(result)
if step > 0:
while first < end:
finally_result.append(result[first])
first += step
return finally_result
else:
end -= 1
while end > first:
finally_result.append(result[end])
end += step
return finally_result
else:
raise ValueError('Param does not be an int or an slice')
过早的优化乃万恶之源
先这样
有问题还请不吝赐教