Python协程之yield和yield from实例详解
协程是一种轻量级的线程,可以在单个线程中实现并发。Python中的协程通过生成器实现,其中yield和yield from是实现协程的关键。本文将为您提供一个完整攻略,详细讲解yield和yield from的用法,并提供两个示例说明。
1. yield的用法
yield是Python中实现协程的关键字之一。它可以将一个函数转换为生成器,使得函数可以在执行过程中暂停,并在需要时恢复执行。以下是一个使用yield实现协程的示例:
def coroutine():
print("Coroutine started.")
while True:
value = yield
print("Coroutine received: {}".format(value))
c = coroutine()
next(c)
c.send("Hello, world!")
c.send("How are you?")
在上面的示例中,我们定义了一个名为coroutine的函数,并在其中使用yield关键字将其转换为生成器。在生成器中,我们使用while循环和yield语句实现了一个协程。在协程中,我们使用yield语句接收一个值,并输出一条消息。
2. yield from的用法
yield from是Python中实现协程的另一个关键字。它可以将一个生成器嵌套在另一个生成器中,使得生成器可以在执行过程中暂停,并在需要时恢复执行。以下是一个使用yield from实现协程的示例:
def sub_coroutine():
while True:
value = yield
print("Sub-coroutine received: {}".format(value))
def coroutine():
print("Coroutine started.")
yield from sub_coroutine()
c = coroutine()
next(c)
c.send("Hello, world!")
c.send("How are you?")
在上面的示例中,我们定义了两个函数:coroutine和sub_coroutine。在coroutine函数中,我们使用yield from关键字将sub_coroutine函数嵌套在其中,实现了一个协程。在协程中,我们使用yield语句接收一个值,并输出一条消息。
示例一
以下是一个使用yield实现协程的示例,它可以计算斐波那契数列:
def fibonacci():
a, b = 0, 1
while True:
value = yield a
if value == "reset":
a, b = 0, 1
else:
a, b = b, a + b
f = fibonacci()
next(f)
for i in range(10):
print(f.send(None))
f.send("reset")
for i in range(10):
print(f.send(None))
在上面的示例中,我们定义了一个名为fibonacci的函数,并在其中使用yield关键字将其转换为生成器。在生成器中,我们使用while循环和yield语句实现了一个协程。在协程中,我们使用yield语句接收一个值,并计算斐波那契数列。如果接收到的值是"reset",则重置斐波那契数列。
示例二
以下是一个使用yield from实现协程的示例,它可以读取一个文件的内容:
def read_file(filename):
with open(filename, "r") as f:
while True:
line = f.readline()
if not line:
break
yield line.strip()
def print_lines(filename):
print("Printing lines from file: {}".format(filename))
yield from read_file(filename)
c = print_lines("file.txt")
next(c)
for line in c:
print(line)
在上面的示例中,我们定义了两个函数:read_file和print_lines。在read_file函数中,我们使用with语句打开文件,并使用yield语句逐行读取文件的内容。在print_lines函数中,我们使用yield from关键字将read_file函数嵌套在其中,实现了一个协程。在协程中,我们使用yield语句输出一条消息,并逐行输出文件的内容。
总结
yield和yield from是Python中实现协程的关键字之一。通过使用yield和yield from,可以将一个函数转换为生成器,并实现协程。本文详细讲解了yield和yield from的用法,并提供了两个示例说明,分别使用yield和yield from实现了斐波那契数列计算和读取一个文件的内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python协程之yield和yield from实例详解 - Python技术站