python 关键字 yield 用法

python 关键字 yield 用法

    • yield 的基本用法

yield
词典里有两个解释:产出和让步
1.produce or provide (a natural, agricultural, or industrial product).
“the land yields grapes and tobacco”
2.give way to arguments, demands, or pressure.
“the Western powers now yielded when they should have resisted”
在python的生成器中,这两个含义都有体现,既产生值,又进行停顿。yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器。

yield 的基本用法

代码一会直接按顺序输出1到10

#代码一
def creatnum1(n):
	numList = [i for i in range(n)]
	for item in numList:
	    return  item
creatnum1(10)    

下面的代码不会一次输出全部的数据

#代码二
def creatnum2(n):
	numList = [i for i in range(n)]
	for item in numList:
	    yield item
yieldout= creatnum2(10)

在代码二中,yield item 这行代码会产生一个值,供给next(…)函数的调用方。此外与一中不同的是,产生的值不会一次输出完,而是会做出让步,在产生一个输出之后就停下来,然后等待下一次调用。

>>> next(yieldout)
0
>>>next(yieldout)
1

这种特性很适合有大量的数据需要处理,但是又不希望或者不能够一次将所有的数据都读取到内存中的场景。

除了使用next调用,返回的结果还可以像正常的迭代器一样使用。

yieldout= creatnum2(10)
for i in yieldout:
    print(i)
---------------------------------------------------------------------------    
0
1
2
3
4
5
6
7
8
9

使用next(…)函数会有一个问题,当生成器已经没有元素的时候会发生异常。

>>>next(yieldout)
9
>>>next(yieldout)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
 in ()
----> 1 next(yieldout)

StopIteration: 

在yield掉所有的值后,next()触发了一个StopIteration的异常。这个异常告诉我们,所有的值都已经被yield完了。
在使用for循环时没有这个异常,是因为for循环会自动捕捉到这个异常并停止调用next()

你可能感兴趣的:(python基础,编程基础,yield,Python)