python生成器

【一】Python生成器简介

        在Python中,生成器(Generator)是一种特殊的迭代器,它的主要作用是用于延迟计算和节省内存。相比于常规的列表,生成器可以一次性生成一些数据,而不是将整个数据集保存在内存中。

【二】生成器函数

        生成器函数是用于创建生成器的函数,其特点是使用yield语句返回一个生成器对象,而不是使用return语句返回一个普通的值。生成器函数可以像普通函数一样被调用,并且可以使用yield语句生成一些数据,当生成器被遍历时,它会依次产生这些数据。

下面是一个简单的生成器函数的示例:

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

该生成器函数可以生成0到9之间的数字,可以通过以下方式遍历生成器:

gen = my_generator()
for i in gen:
    print(i)

【三】生成器表达式

        除了生成器函数,Python还提供了一种快速创建生成器的方式——生成器表达式。生成器表达式是一种类似于列表推导式的语法结构,但是它返回的是一个生成器对象,而不是一个列表对象。

创建生成器的两种方式

【1】列表的推导式

gend = (i for i in range(1,10))
#
print(next(gend))
print(next(gend))
print(next(gend))
print(next(gend))
​
​
# 1
# 2
# 3
# 4

【2】yield关键字

def sheng():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5
​
​
gend = sheng()
​
print(next(gend))
print(next(gend))
print(next(gend))
print(next(gend))
print(next(gend))
​
​
# 1
# 2
# 3
# 4
# 5

【四】yield + next

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()

print(next(gen))  # 输出 1
print(next(gen))  # 输出 2
print(next(gen))  # 输出 3

# 当没有更多的值可供生成器产生时,调用 next() 会引发 StopIteration 异常
try:
    print(next(gen))
except StopIteration:
    print('No more items.')

 

【五】生成器的优点

        与常规的列表相比,生成器具有以下优点:

  1. 节省内存。由于生成器是一次性生成一些数据,而不是将整个数据集保存在内存中,因此可以节省大量的内存空间。
  2. 延迟计算。由于生成器是惰性求值的,只有在需要时才会计算,因此可以延迟计算,避免不必要的计算。
  3. 可以无限生成数据。由于生成器是动态生成数据的,因此可以无限生成数据,而不需要提前知道数据集的大小。

        需要注意的是,生成器函数可以包含多个 yield 语句,并且可以在必要时接收参数和返回值。此外,生成器函数还可以与循环、条件语句等结构进行组合,以实现更加复杂的逻辑。

        最后,需要注意的是,生成器函数是一种非常强大和灵活的工具,但也需要谨慎使用。如果你没有正确地理解生成器函数的工作原理和机制,可能会导致一些难以调试和理解的问题。因此,在使用生成器函数时,请务必仔细阅读文档,了解其用法和限制,遵循最佳实践,并进行充分的测试和验证。

你可能感兴趣的:(python)