python 生成器函数 yield关键字
生成器(generator)和迭代器(iterator)
迭代器(iterator)
python中,迭代器,是一个可迭代对象,可以使用for… in的方式来遍历。
for i in iterator:
生成器(generator)
生成器是迭代器的一种,也是一个可迭代对象。但是生成器的一个重要特性是:惰性计算。
惰性计算
生成器,在被for…in迭代时,不同于迭代器
- 迭代器,在第一次调用的时候,就返回一个iterator,并且后续的for in都是对这个返回的迭代器进行遍历。是一次性生成所有的数据,放入内存中。
- 生成器,是惰性计算,默认在内存中只存储一个值,即当前迭代的值。之后每迭代一次,才计算当前值,然后存储,替换掉上次的值。
在惰性计算的特性下,生成器,相比于迭代器,更加节省内存,在处理大量流式数据时,更灵活,而无需一次性将所有数据读入内存。
创建生成器函数、yield关键字
通过yield关键字,我们可以创建自定义的生成器函数,返回一个生成器对象。
下面的函数,在遍历documents时,使用了yield关键字。可以看作一个return。
但是是每一次循环,就yield一次,这点和return不同。
该函数返回一个generator对象。
当后续遍历这个generator对象时。每次迭代,就进行函数内的这个for循环一次,返回循环的结果。
看似和一次性生成所有的数据时,操作完全一样,但是占用的内存会小很多。因为惰性计算的特性,每迭代一次才计算一次,同一时间内,内存只保留当前iteration的值,而不是所有的数据
def format_datas():
documents = import_from_ndjson("../clawer/data_test.json")
index_head = {"index": {"_index": "pharm_iksmart"}}
for doc in documents:
yield [index_head,doc]
for i in format_datas():
print(i)
_____________________________________________
doc1
doc2
doc3