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

Python生成器函数:yield关键字用法详解

发布时间:2023-06-30 09:01:56

yield是Python中用于构建生成器函数的关键字。生成器函数是一种特殊的函数,可以以延迟计算(lazy evaluation)的方式生成一个序列(或流)的值,而不是一次性生成所有的值。

生成器函数和普通函数的区别在于,生成器函数中包含yield关键字,当生成器函数被调用时,它们并不立即执行,而是返回一个生成器对象。生成器对象可以像迭代器一样被循环遍历,每次遍历时执行yield语句,返回一个值,并暂停执行,直到下次迭代时再继续执行。

以下是一个简单的生成器函数的例子:

def number_generator(n):
    for i in range(n):
        yield i

# 调用生成器函数,返回一个生成器对象
gen = number_generator(5)

# 遍历生成器对象,依次打印每个值
for num in gen:
    print(num)

上面的例子定义了一个名为number_generator的生成器函数,它接受参数n,用于指定生成的序列的长度。在函数体内部,使用for循环和yield关键字生成从0到n-1的数字。调用该生成器函数时,它返回一个生成器对象gen。然后我们可以使用for循环遍历生成器对象,每次迭代时执行yield语句并打印返回的值。

在生成器函数中,yield语句的作用类似于return语句,但它不会终止函数的执行,而是返回一个值,并保存函数当前的状态,以便下次从此位置继续执行。

生成器函数还支持两种特殊的操作:send()和close()方法。

- send()方法允许在生成器的每次迭代中向其发送一个值,并将其作为yield语句的返回值。示例如下:

def number_generator(n):
    for i in range(n):
        x = yield i
        print('Received:', x)

gen = number_generator(3)
next(gen)  # 启动生成器
gen.send(10)  # 向生成器发送一个值并打印返回值
gen.send(20)
gen.send(30)

上面的例子中,首先需要调用next()方法启动生成器。然后我们使用send()方法向生成器发送一个值,并打印返回的值。生成器被重新激活后,执行到yield语句处暂停,将接收到的值赋给变量x,并打印出来。接着我们继续使用send()方法发送其他的值,并打印返回的值。

- close()方法用于关闭生成器,关闭后无法再向生成器发送值或调用next()方法。示例如下:

def number_generator(n):
    for i in range(n):
        yield i

gen = number_generator(3)
print(next(gen))
gen.close()
print(next(gen))  # 抛出StopIteration异常

上面的例子中,我们使用next()方法输出了生成器的 个值,然后使用close()方法关闭了生成器。关闭后,再次调用next()方法会抛出StopIteration异常,表示无法继续迭代。

总结:

- yield关键字用于构建生成器函数,生成器函数可以以延迟计算的方式生成一个序列的值。

- 生成器函数在被调用时返回一个生成器对象,可以像迭代器一样被循环遍历。

- yield语句的作用类似于return语句,但它不会终止函数的执行,而是返回一个值,并保存函数当前的状态,以便下次从此位置继续执行。

- 生成器函数支持send()方法和close()方法,分别用于向生成器发送值和关闭生成器。