下面我将详细讲解“Python函数式编程指南(四):生成器详解”的攻略。
生成器是一种特殊的函数,可以在调用过程中产生一系列值,而不是将它们一次性产生出来。使用生成器可以避免占用大量的内存空间,特别是当需要产生大量的数据时。
生成器的特点如下:
创建一个生成器的方法有两种:
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