python 生成器函数 yield关键字

本文详细介绍了Python中的生成器和迭代器,重点讲解了生成器的惰性计算特性,以及如何通过yield关键字创建自定义生成器函数,以节省内存并实现流式数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成器(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值