純python代碼實(shí)現(xiàn)一個range函數(shù)

源代碼:

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

        # 保留原始參數(shù)
        self.origin_start = self.start
        self.origin_stop = self.stop + 1
        self.origin_step = self.step

    def __repr__(self):
        """
        :return: 顯示表現(xiàn)
        """
        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: 返回當(dāng)前數(shù)字,然后在當(dāng)前數(shù)字上+1
        """
        result = self.start
        if self.start <= self.stop:
            self.start += 1
        else:
            raise StopIteration

        return result

    def __getitem__(self, item):
        """
        :param item: 如果是單個數(shù)字, 那么item的類型將會是int,
                      如果是分片那么item將會是一個slice.
        :return: 返回分片結(jié)果
        """

        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)

# 顯示結(jié)果
range(0, 10)          MyRange(0, 10)
range(10, 20)          MyRange(10, 20)

?
?

打印單個分片信息

print(range(10)[4], MyRange(10)[4], sep=' ' * 10)
# 顯示結(jié)果
4          4

?
?

打印一組分片信息

print(range(10)[5:8], MyRange(10)[5:8], sep=' ' * 10)
# 顯示結(jié)果
range(5, 8)          MyRange(5, 8)

?
?

循環(huán)迭代

for i in range(10):
    print('range: ', i)

print('\n')

for i in MyRange(10):
    print('MyRange: ', i)
    
# 顯示結(jié)果
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])

# 顯示結(jié)果
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: 分片不得大于最大值.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,119評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,597評論 19 139
  • 煙囪是無家的野鬼 翻著白眼 殘暴地親吻城市的臉
    初五閱讀 171評論 4 1
  • 書籍《活法》和《干法》作者稻盛和夫<作者簡介當(dāng)當(dāng)上有> 書的目錄<主動搜索利于學(xué),了解目錄窺全文> 我看過稻盛和夫...
    從0721開始日更閱讀 269評論 0 2

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