使用python的迭代器和生成器模擬python內置的range函數

"""
使用python的迭代器和生成器模擬python內置的range函數
"""


def use_range():
    """python內置的range函數"""
    for i in range(5, 10):
        print(i)


class IterRange(object):
    """使用迭代器來模擬range()函數"""

    def __init__(self, start, end):
        """通過構造函數傳範圍的值"""
        self.start = start - 1

        self.end = end

    def __next__(self):
        self.start += 1
        if self.start >= self.end:
            raise StopIteration
        return self.start

    def __iter__(self):
        return self


class GenRange(object):
    """使用生成器模擬range函數"""

    def __init__(self, start, end):
        """通過構造函數傳範圍的值"""
        self.start = start - 1
        self.end = end

    def get_num(self):
        """
        生成數
        遇到yield程序會暫停執行,直到下次被喚醒,在執行一次
        """
        while True:
            if self.start >= self.end - 1:
                break
            self.start += 1
            yield self.start


def get_num(start, end):
    """用函數的方式使用生成器實現range函數"""
    start -= 1
    while True:
        if start >= end - 1:
            break
        start += 1
        yield start


if __name__ == '__main__':
	# 演示內置range函數
    # use_range()
	
	# 迭代器實現range用列表返回
    iter_num = IterRange(5, 10)
    # print(next(iter_num))
    # print(next(iter_num))
    # print(next(iter_num))
    # print(next(iter_num))
    # print(next(iter_num))
    # 生成一個列表
    l1 = list(iter_num)
    print(l1)
    print("-----------------")
    
	# 生成器模擬range並返回列表
    gen = GenRange(5, 10).get_num()
    print(gen)  # 返回一個對象
    print(list(gen))  # 強制轉換成列表形式
    
    print("-----------------")
    gen_temp = get_num(5, 10)
    print(gen)  # 返回一個對象
    print(list(gen_temp))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章