Python 关键字 yield 的理解

为了更好地理解关键字yield的用法,首先需要理解迭代器(iterator)与生成器(generator)的区别。当创建列表中的元素时,我们可以使用for循环:

>>> myIterator = [x*x for x in range(3)]
>>> print(myIterator)
[0, 1, 4]

因此我们称列表是可迭代的(iterable)。但是基于这种方法逐次访问列表中的元素时,需要首先将包含所有元素的列表创建并保存,当元素数量过多时可能造成内存空间的利用效率下降。因此考虑只进行一次迭代的生成器,并不在访问元素之前将所有元素值存储在内存空间,而是在迭代过程中生成要访问的元素,并且访问过的元素就不会再存储在生成器所占的内存空间中。

>>> myGenerator = (x*x for x in range(3))
>>> print(myGenerator)
<generator object <genexpr> at 0x000001F67D449518>
>>> for i in myGenerator:
	    print(i)

0
1
4
>>> print(myGenerator)
<generator object <genexpr> at 0x000001F67D449518>
>>> for i in myGenerator:
	    print(i)

>>> 

上述代码首先创建生成器对象,使用for循环迭代访问生成器中的每一个元素时,可以看到进行一次迭代后生成器就变为空。也可以将生成器对象转换为列表对象,生成器在访问一次之后变为空就可以更明显地看出来:

>>> myGenerator = (x*x for x in range(3))
>>> print(myGenerator)
<generator object <genexpr> at 0x000001B3A48DED00>
>>> print(list(myGenerator))
[0, 1, 4]
>>> print(list(myGenerator))
[]

而关键字yield的作用类似于return,但返回的是一个生成器对象,注意代码示例表示返回的生成器的元素为i*i

>>> def createGenerator():
	    for i in range(3):
		    yield i*i

>>> mygenerator = createGenerator()
>>> print(mygenerator)
<generator object createGenerator at 0x000001F67D449518>
>>> for item in mygenerator:
	    print(item)

0
1
4
>>> 

在nlp相关应用中,可能在读取数据集时会使用到yield关键字以节省内存开销,代码示例表示返回的生成器中的元素是列表:

>>> def read_dataset(file):
	    for line in file:
		    yield [word for word in line.split(" ")]

>>> dataset = ["hello world", "i love china", "are you ok"]
>>> train = read_dataset(dataset)
>>> print(train)
<generator object read_dataset at 0x000001F67D46CD00>
>>> print(list(train))
[['hello', 'world'], ['i', 'love', 'china'], ['are', 'you', 'ok']]
>>> print(list(train))
[]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值