源代碼:
class MyRange:
def __init__(self, start, stop=None, step=None):
# 模擬range從0開始的行為
if stop is None:
self.start = 0
self.stop = start - 1
else:
self.start = start
self.stop = stop - 1
self.step = step
# 保留原始參數
self.origin_start = self.start
self.origin_stop = self.stop + 1
self.origin_step = self.step
def __repr__(self):
"""
:return: 顯示表現
"""
if self.origin_step:
result = '{}({}, {}, {})'.format(
self.__class__.__name__,
self.origin_start,
self.origin_stop,
self.origin_step
)
else:
result = '{}({}, {})'.format(
self.__class__.__name__,
self.origin_start,
self.origin_stop
)
return result
def __iter__(self):
return self
def __next__(self):
"""
:return: 返回當前數字,然后在當前數字上+1
"""
result = self.start
if self.start <= self.stop:
self.start += 1
else:
raise StopIteration
return result
def __getitem__(self, item):
"""
:param item: 如果是單個數字, 那么item的類型將會是int,
如果是分片那么item將會是一個slice.
:return: 返回分片結果
"""
def is_index_error(_start):
if _start > self.stop:
raise IndexError('分片不得大于最大值.')
if isinstance(item, int):
result = self.origin_start + item
is_index_error(result)
elif isinstance(item, slice):
start = self.origin_start + item.start
stop = self.origin_start + item.stop
list(map(is_index_error, MyRange(start, stop)))
result = MyRange(start, stop)
else:
raise KeyError
return result
?
?
打印類對象信息
print(range(10), MyRange(10), sep=' ' * 10)
print(range(10, 20), MyRange(10, 20), sep=' ' * 10)
# 顯示結果
range(0, 10) MyRange(0, 10)
range(10, 20) MyRange(10, 20)
?
?
打印單個分片信息
print(range(10)[4], MyRange(10)[4], sep=' ' * 10)
# 顯示結果
4 4
?
?
打印一組分片信息
print(range(10)[5:8], MyRange(10)[5:8], sep=' ' * 10)
# 顯示結果
range(5, 8) MyRange(5, 8)
?
?
循環迭代
for i in range(10):
print('range: ', i)
print('\n')
for i in MyRange(10):
print('MyRange: ', i)
# 顯示結果
range: 0
range: 1
range: 2
range: 3
range: 4
range: 5
range: 6
range: 7
range: 8
range: 9
MyRange: 0
MyRange: 1
MyRange: 2
MyRange: 3
MyRange: 4
MyRange: 5
MyRange: 6
MyRange: 7
MyRange: 8
MyRange: 9
?
?
異常處理
s = MyRange(10)
print(s[15])
# 顯示結果
Traceback (most recent call last):
File "XXXXXXXX.py", line 117, in <module>
File "XXXXXXXX.py", line 69, in __getitem__
File "XXXXXXXX.py", line 65, in is_index_error
IndexError: 分片不得大于最大值.