Python yield的用法详解

Python yield的用法详解

Python yield的用法详解

1. 引言

在Python中,yield是一个非常重要的关键字,它通常与生成器函数一起使用,用于创建可迭代对象。本文将详细介绍yield的用法,包括生成器函数、生成器对象以及yield from语句的使用。

2. 生成器函数

生成器函数是一种使用yield语句来生成迭代器的特殊函数。使用yield语句的函数被称为生成器函数,当生成器函数被调用时,它不会立即执行,而是返回一个迭代器对象。每当迭代器对象的__next__()方法被调用时,生成器函数会从上一次暂停的地方继续执行,直到遇到下一个yield语句。

下面是一个简单的生成器函数的示例:

def count_up_to(n):
    i = 0
    while i < n:
        yield i
        i += 1

# 使用生成器函数创建生成器对象
counter = count_up_to(5)

# 调用迭代器对象的__next__()方法来取得下一个值
print(counter.__next__())  # 输出:0
print(counter.__next__())  # 输出:1
print(counter.__next__())  # 输出:2
Python

运行上述代码,可以看到生成器函数count_up_to()通过yield语句来生成一个迭代器对象counter。每次调用counter.__next__()方法都会返回生成器函数中yield语句的值,并将生成器函数从上一次暂停的位置继续执行。

3. 生成器对象

生成器对象可以通过生成器函数创建,也可以使用生成器表达式来创建。生成器对象是可迭代对象,可以用于迭代操作,例如使用for循环来遍历生成器对象。

下面是一个使用生成器表达式创建生成器对象的示例:

evens = (x for x in range(10) if x % 2 == 0)

# 使用for循环遍历生成器对象
for num in evens:
    print(num, end=' ')  # 输出:0 2 4 6 8
Python

上述代码中,生成器表达式(x for x in range(10) if x % 2 == 0)创建了一个生成器对象evens,该生成器对象会生成0到9之间的所有偶数。使用for循环遍历生成器对象时,每次迭代都会生成一个新的偶数,直到生成器对象没有更多的值可生成为止。

4. yield from语句

yield from语句是Python 3.3中引入的新语法,用于在生成器中委托子生成器的执行。yield from语句简化了使用嵌套for循环来遍历多个生成器的操作。

下面是一个使用yield from语句委托子生成器的示例:

def child_generator():
    yield 1
    yield 2
    yield 3

def parent_generator():
    yield from child_generator()
    yield 'done'

# 使用for循环遍历父生成器
for value in parent_generator():
    print(value, end=' ')  # 输出:1 2 3 done
Python

在上述代码中,parent_generator()是一个父生成器函数,它通过yield from语句委托子生成器child_generator()的执行。当yield from语句被执行时,子生成器的所有值会直接传递给父生成器,从而实现了对多个生成器的遍历。

5. 使用yield实现协程

协程是一种特殊的函数,可以在执行过程中暂停并恢复。在Python中,可以使用yield关键字来实现协程,并通过send()方法来向协程发送数据。

下面是一个简单的协程示例:

def coro():
    while True:
        received = yield  # 接收send()方法发送的值
        print('Received:', received)

c = coro()
c.__next__()  # 等同于c.send(None)

c.send('Hello')  # 输出:Received: Hello
c.send(123)  # 输出:Received: 123
Python

在上述代码中,协程函数coro()通过yield语句暂停执行,并通过yield关键字接收send()方法发送的值。通过调用c.__next__()或者c.send(None)方法,可以启动协程的执行。之后,可以通过调用c.send(value)方法向协程发送值,协程会从上一次暂停的地方继续执行,并将发送的值作为yield语句的结果。

6. 总结

本文详细介绍了Python中yield的用法。首先介绍了生成器函数的概念及基本用法,然后介绍了生成器对象和生成器表达式的使用。之后,对yield from语句的使用进行了详细说明,并给出了示例代码。最后,介绍了如何使用yield关键字实现协程。

yield是Python中一个非常强大和灵活的特性,掌握了它的用法可以使代码更简洁和高效。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册