有時會遇到這種場景,在數據量特別大的情況下,不能一次性將數據讀到內存中,此時迭代器便派上用場。即一次性只讀有限的數據量,在下一次函數或者對象調用時,在上一次的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]