详解Python 生成器

  • Post category:Python

生成器是Python中非常重要的概念之一,它只需在函数定义中使用yield语句即可创建。生成器允许你按需产生一系列的值,而不是一次性地生成。使用生成器的好处在于它允许你使用非常少的内存生成序列,因此非常适用于处理大型数据集合。以下是详细的生成器使用方法攻略:

定义生成器

在Python中定义一个生成器只需将函数中的return语句替换为yield:

def create_generator():
    for i in range(10):
        yield i

gen = create_generator()
for i in gen:
    print(i) # 输出 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

在上述代码中,我们定义了一个生成器函数create_generator(),在函数中使用yield语句按需产生一个列表中的每个元素。通过在函数调用中使用next()方法,我们逐个访问每个生成器产生的元素。

生成器表达式

除了使用函数定义以外,你还可以使用生成器表达式创建生成器。它类似于列表表达式,但用圆括号替换了方括号,并使用yield语句替换元素:

gen = (x ** 2 for x in range(5))
for i in gen:
    print(i) # 输出 0, 1, 4, 9, 16

在上述代码中,我们使用生成器表达式创建了一个返回0到4的数值的平方的生成器,然后输出每个生成器元素的值。

生成器方法

在Python中有许多生成器方法,一些最常用的方法如下:

next()方法

使用next()方法从生成器中获取下一个值。

def create_generator():
    for i in range(10):
        yield i

gen = create_generator()
print(next(gen)) # 输出 0
print(next(gen)) # 输出 1

在上述代码中,我们使用next()方法从生成器中获取下一个值,每个next()方法调用会依次返回生成器中的每个元素。

send()方法

使用send()方法将数据传入生成器。

def create_generator():
    n = yield
    while True:
        yield n
        n += 1

gen = create_generator()
next(gen)
gen.send(10)
print(next(gen)) # 输出 11

在上述代码中,我们使用send()方法将10传入生成器中,然后利用next()方法调用生成器的下一个元素。

close()方法

使用close()方法主动关闭生成器。

def create_generator():
    for i in range(10):
        yield i

gen = create_generator()
print(next(gen)) # 输出 0
gen.close()
print(next(gen)) # 抛出StopIteration异常

在上述代码中,我们使用close()方法关闭了生成器,然后通过next()方法尝试获取下一个元素时,抛出了StopIteration异常。

以上是Python生成器使用方法的完整攻略及两个示例说明。