Python 编写生成器函数

  • Post category:Python

生成器函数是一种特殊的函数,它可以生成迭代器对象。在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生成器函数功能的冰山一角,通过了解更多相关文档和实践,你可以发掘它更强大的能力。