关键词

Python函数式编程指南(四):生成器详解

下面我将详细讲解“Python函数式编程指南(四):生成器详解”的攻略。

什么是生成器?

生成器是一种特殊的函数,可以在调用过程中产生一系列值,而不是将它们一次性产生出来。使用生成器可以避免占用大量的内存空间,特别是当需要产生大量的数据时。

生成器的特点如下:

  • 可以通过 for 循环逐个遍历生成的值。
  • 可以使用 next() 函数获取下一个生成的值。
  • 可以使用 yield 语句将中间结果返回。

如何创建一个生成器?

创建一个生成器的方法有两种:

方法一:通过生成器函数创建

def my_generator():
    yield 1
    yield 2
    yield 3

g = my_generator()

在上面的代码中,我们定义了一个名为 my_generator 的生成器函数,并在该函数中使用了三个 yield 语句,该函数可以产生 1、2、3 这三个数字。接下来,我们将 my_generator 函数赋值给变量 g,就可以在后面的代码中使用它了。

方法二:通过生成器表达式创建

和列表推导式类似,我们也可以使用生成器表达式创建生成器。

g = (x*x for x in range(3))

上面的代码中,我们创建了一个生成器 g,它可以产生 0、1、4 这三个数字的平方。

如何遍历生成器?

使用 for 循环逐个遍历生成器中的值是最常见也是最简单的方法。

g = my_generator()
for value in g:
    print(value)

上面的代码中,我们先创建了一个 my_generator 的生成器,然后使用 for 循环逐个遍历其中的值并打印出来。

当然,我们也可以使用 next() 函数逐个获取生成器中的值。

g = my_generator()
print(next(g))
print(next(g))
print(next(g))

示例一:斐波那契数列

生成器可以非常方便地生成斐波那契数列。

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

f = fibonacci()

for i in range(10):
    print(next(f))

在上面的代码中,我们创建了一个名为 fibonacci 的生成器函数,它可以无限产生斐波那契数列中的数字。然后我们将该生成器函数赋值给变量 f,并使用 for 循环打印出其中的前 10 个数。

示例二:归并排序

生成器可用于实现归并排序。

def merge(left, right):
    l, r = 0, 0
    while l < len(left) and r < len(right):
        if left[l] < right[r]:
            yield left[l]
            l += 1
        else:
            yield right[r]
            r += 1
    yield from left[l:]
    yield from right[r:]

def merge_sort(lst):
    if len(lst) <= 1:
        return lst
    mid = len(lst) // 2
    left, right = lst[:mid], lst[mid:]
    left, right = merge_sort(left), merge_sort(right)
    return list(merge(left, right))

lst = [3, 2, 1, 5, 4]
g = merge_sort(lst)
print(list(g))

在上述代码中,我们实现了归并排序并将结果保存在生成器变量 g 中。最后一行代码将 g 转换为列表并打印出来。

总结

以上就是使用生成器的方法和示例,生成器可以大大简化代码,避免占用过多的内存空间,是编程中必须掌握的一项技能。

本文链接:http://task.lmcjl.com/news/14994.html

展开阅读全文