Python中for yield

在Python中,我们经常会使用for循环来遍历一个序列或者集合。同时,Python还提供了yield关键字,用于定义一个生成器函数。本文将介绍for循环和yield关键字的用法,并且通过代码示例详细说明它们的使用方法和区别。

for循环

for循环是Python中最常用的循环结构之一,用于遍历一个序列或者集合中的元素。其基本语法如下:

for <variable> in <sequence>:
    <block>

其中,<variable> 是一个变量名,用于存储每次迭代时的元素值;<sequence> 是要遍历的序列或者集合;<block> 是一个代码块,用于处理每个元素。

下面是一个简单的示例,通过for循环遍历一个列表并打印每个元素:

fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)

运行上述代码,会输出以下结果:

apple
banana
cherry

yield生成器函数

在Python中,生成器函数是一种特殊的函数,它使用yield关键字来生成一个序列的值。生成器函数与普通函数的不同之处在于,它的执行是惰性的,即只有在需要的时候才会生成一个值,并且可以暂停和继续执行。这种特性使得生成器函数非常适合处理大量数据或者无穷序列。

下面是一个简单的示例,定义一个生成器函数countdown,用于生成一个从指定数字倒数至零的序列:

def countdown(n):
    while n > 0:
        yield n
        n -= 1

for i in countdown(5):
    print(i)

运行上述代码,会输出以下结果:

5
4
3
2
1

yield from语法

在Python 3.3及以上的版本中,可以使用yield from语法来简化生成器函数的编写。yield from语法可以将一个可迭代对象的值逐一传递给外层生成器函数。

下面是一个示例,定义一个生成器函数flatten,用于将嵌套的列表展平:

def flatten(lst):
    for item in lst:
        if isinstance(item, list):
            yield from flatten(item)
        else:
            yield item

nested_list = [1, [2, [3, 4], 5], 6]
for item in flatten(nested_list):
    print(item)

运行上述代码,会输出以下结果:

1
2
3
4
5
6

序列图

为了更好地演示for循环和yield关键字的执行过程,下面使用序列图来表示它们的交互过程。

sequenceDiagram
    participant for
    participant yield
    participant generator
    
    for->>+generator: 调用生成器函数
    generator->>for: 返回生成器对象
    for->>generator: 调用生成器对象的__next__()方法
    generator->>yield: 生成一个值并暂停执行
    yield->>for: 返回生成的值
    for->>generator: 继续调用生成器对象的__next__()方法
    generator->>yield: 生成下一个值并暂停执行
    yield->>for: 返回生成的值
    ... 循环执行,直到生成器结束 ...
    generator-->>for: 抛出StopIteration异常

通过上述序列图,可以清楚地看到for循环和yield关键字之间的交互过程。

总结起来,for循环和yield关键字是Python中非常有用的特性。for循环用于遍历序列或者集合中的元素,而yield关键字用于定义生成器函数,可以生成一个序列的值。它们的结合使用可以帮助我们处理大量数据或者无穷序列,并且可以提升程序性能和内存使用效率。

【参考资料】

  • [