迭代器實現的固定數據獲取

有時會遇到這種場景,在數據量特別大的情況下,不能一次性將數據讀到內存中,此時迭代器便派上用場。即一次性只讀有限的數據量,在下一次函數或者對象調用時,在上一次的index下繼續讀取下一個有限長度的數據,即可以通過python的yield實現。下面通過兩種方式進行實現:可迭代對象的方式和生成器函數的方式。

#可迭代對象
class IterObject:
    def __init__(self, numbers, limit):
        self.numbers = numbers
        self.limit = limit

    def __iter__(self):
        count, ret = 0, []
        for number in self.numbers:
            ret.append(number)
            count += 1
            if count == self.limit:
                yield ret
                count, ret = 0, []
        if ret:
            yield ret


#生成器函數
def get_limit_number(numbers, limit):
    count, ret = 0, []
    for number in numbers:
        ret.append(number)
        count += 1
        if count == limit:
            yield ret
            count, ret = 0, []
    if ret:
        yield ret


def main():
    #生成器列表
    seed_numbers = (i for i in range(23))
    limit = 10
    for num in get_limit_number(seed_numbers, limit):
        print("Generate get value: {0}".format(num))

    print("*"*60)

    #需要重新產出數據,否則直接使用前面的seed_numbers爲空。
    seed_numbers = (i for i in range(23))
    limit = 10
    obj = IterObject(seed_numbers, limit)
    for num in obj:
        print("Iterable get value: {0}".format(num))


if __name__ == "__main__":
    main()

運行結果如下:

Generate get value: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Generate get value: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Generate get value: [20, 21, 22]
************************************************************
Iterable get value: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Iterable get value: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Iterable get value: [20, 21, 22]

 

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