欢迎访问宙启技术站
智能推送

Python中生成器函数:yield的作用和用法详解

发布时间:2023-06-11 04:22:56

yield是Python中的一个关键字,用于生成器函数中。生成器函数是一种特殊的函数,它与普通函数不同的是:生成器函数在执行过程中可以暂停跳出,并且可以再次恢复执行。yield就是在生成器函数中用来控制这个特殊流程的关键字。

先看一个简单的例子:

def generator():
    yield 1
    yield 2
    yield 3

g = generator()
print(next(g))
print(next(g))
print(next(g))

输出结果为:

1
2
3

在这个例子中,我们定义了一个generator函数,函数中包含了三个yield语句。当我们调用generator函数时,会返回一个生成器对象g。我们通过调用next(g)来获取生成器中的值,每次调用时,生成器会执行到下一个yield语句处,返回该语句的值,并暂停。直到我们再次调用next(g),生成器才会从暂停处继续执行。如果生成器的执行到了最后一个yield语句,那么再次调用next(g)会抛出StopIteration异常。

当然,yield不仅仅只能用来返回一个值,它还有其他用法。

1. 生成器函数中的参数传递

def double(val):
    while True:
        val = val * 2
        yield val

g = double(1)
print(next(g))
print(next(g))
print(next(g))

输出结果为:

2
4
8

在这个例子中,我们在生成器函数中传入了一个参数val,生成器会对这个参数进行处理,并返回处理后的新值。每次调用next(g)时,都会重新执行while循环,并返回一个新的值。这种用法可以实现一个可无限循环生成的序列。

2. 从生成器中获取值

def process():
    yield
    value = yield
    print(value)
    yield

g = process()
next(g)
g.send(1)
g.send(2)

输出结果为:

1

在这个例子中,生成器函数中包含了两个yield语句。我们首先调用next(g)来执行第一个yield语句,然后再调用g.send(1)来执行第二个yield语句。在第二个yield语句的位置,我们可以通过yield表达式获取生成器函数实参传入的值。在这个例子中,我们将1传入了生成器函数的value变量中。然后我们打印了这个变量的值,并再次通过yield语句暂停了生成器。

最后一个例子展示了用yield关键字来实现协程并发编程中的协程yield语句,可以用来切换协程的执行。许多Python的网络框架和异步I/O库都用到了协程的技术,因为协程可以极大的提高程序执行效率。而yield关键字作为协程编程的核心要素,可以在Python中实现强大的异步能力。

总结:yield是Python中一个十分重要的关键字,它可以用在生成器函数中来控制生成器的执行流程,让生成器在执行过程中能够暂停和恢复执行,并且可以再次从上次停止的位置继续执行,这种特性对于实现协程和异步编程非常有用。