Skip to main content
 首页 » 编程设计

理解 Python3 yield关键字

2022年07月19日134linjiqin

理解 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生成器可以实现懒加载,提升应用程序执行效率。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/100639773