迭代器实现的固定数据获取

有时会遇到这种场景,在数据量特别大的情况下,不能一次性将数据读到内存中,此时迭代器便派上用场。即一次性只读有限的数据量,在下一次函数或者对象调用时,在上一次的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]

 

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