生成器函数是一种特殊的函数,它可以生成迭代器对象。在Python中,有两种方式定义生成器函数,分别是使用生成器表达式和使用函数装饰器。
使用生成器表达式
生成器表达式是Python提供的一种生成器函数的简化语法。它使用圆括号包裹一个表达式,类似于列表推导式,但区别是它通过yield语句产生值,而不是在内存中创建一个完整的列表。
下面是一个简单的示例,展示了如何使用生成器表达式生成一个斐波那契数列:
fibonacci = (x if x <= 1 else fibonacci(x-1) + fibonacci(x-2) for x in range(10))
for fib in fibonacci:
print(fib)
在这个示例中,生成器表达式使用递归函数定义了斐波那契数列,并使用range函数生成了一个整数序列。整个生成器表达式返回的是一个迭代器对象,通过for循环逐一取出每个值并打印出来。
使用函数装饰器
函数装饰器是另一种定义生成器函数的方式。在函数定义前加上装饰器@language,其中language是yield语句后面跟着的语言关键字,可以是Python、Java等。被@language装饰的函数称为coroutine协程。
下面是一个简单的示例,展示了如何使用装饰器定义一个计时器协程:
from time import perf_counter
def timer():
start = None
while True:
if start is None:
start = perf_counter()
else:
delta = perf_counter() - start
msg = "Elapsed time: {0:.6f} seconds"
print(msg.format(delta))
start = None
yield
在这个示例中,装饰器@Python告诉Python解释器这是一个Python协程。函数体中通过while True循环进入永久的“等待输入”状态,当协程接收到yield语句时,输出经过时间的累计值。
调用这个协程的方式也很简单:
t = timer()
next(t)
# do something
next(t)
在调用协程时,使用next函数或send函数调用它。先调用next函数使协程进入等待状态,接着在程序运行中,根据需要调用条件语句和协程的输出。
总体上,Python的生成器函数对于处理大量数据和并发处理都有很好的适用性。这两个示例只是展示了Python生成器函数功能的冰山一角,通过了解更多相关文档和实践,你可以发掘它更强大的能力。