理解 Python3 yield关键字
本文面向初学Python者解释yield关键字的用法。首先我们需要理解几个关键概念,如迭代器和生成器,然后用一个具体示例来说明如何使用yield。如果你已经知道了这些必要概念,可以跳过直接进入yield部分。
1. 迭代器
集合是一组数据项,集合可以被迭代。迭代即按照某种顺序获取集合中的每个元素。Python中dict,list,set,tuple都是集合。下面看个示例来说明如何迭代一组整数:
import random
def list_of_random(number_of_values):
res = []
for _ in range(0, number_of_values):
# append a random interger to the result
res.append(random.randint(0, 100))
return res
for value in list_of_random(10):
if value > 60:
# if we foudn a value bigger than 60 print it and exit
print('Value is {0}'.format(value))
break
我们迭代list_of_random(10) 函数的执行结果,其返回随机数列表。需要注意的是,list_of_random在被迭代之前需要先生成10个数值。顺便说下,for后面的_是隐式变量,因为并不要使用索引值,所以使用_代替。
2. 生成器
现在我们已经知道了如何迭代集合。假设我们需要迭代list_of_random ,但不是10个数,而是100万或更多,那么我们需要消耗内存存储函数生成100万个整数。利用生成器可以减少内存占用并加快运行速度。因为如果发现一个数大于60则无需创建100万个整数列表。
下面使用生成器实现同样功能,这里需要注意的是,如果在迭代中使用[],则需要先等待创建100万个整数。
import random
for value in (random.randint(0, 100) for _ in range(0, 10000000)):
if value > 60:
print('Value is {0}'.format(value))
break
3. 使用yield示例
我们已经知道了如何使用生成器,yield就像return的替代,但是yield中的函数返回生成器。下面通过示例来看:
import random
def list_of_random(number_of_values):
for _ in range(0, number_of_values):
yield random.randint(0, 100)
for value in list_of_random(10):
if value > 60:
print('Value is {0}'.format(value))
break
看下函数list_of_random,并没有往list中增加任何元素,仅仅对每个随机整数使用yield。有时使用()一行代码写完更好。但对于更复杂的函数,则需要在函数中使用yield关键字。
4. 总结
如果Python应用需要消耗大量内存为了集合添加或追加等操作,可以尝试使用yield。当在函数中使用yield关键字时,函数内代码并没有实际执行,而是在使用for…in迭代操作是才执行。使用yield生成器可以实现懒加载,提升应用程序执行效率。