在计算机科学中,生成器是特定的迭代器,它完全实现了迭代器接口,所以所有生成器都是迭代器。 不过,迭代器用于从数据集中取出元素;而生成器用于"凭空"生成(yield)元素。它不会一次性将所有元素全部生成,而是按需一个一个地生成,所以从头到尾都只需占用一个元素的内存空间。 很典型的一个例子是斐波纳契数列:斐波纳契数列中的数有无穷个,在一个数据结构里放不下,但是可以在需要下一个元素的时候临时计算。
生成器关键字yield
1.生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration;
def funa():
yield 1
a = funa()
print(next(a))
print(next(a))
2.如果在return后返回一个值,那么这个值为StopIteration异常的说明,不是程序的返回值。
def funa():
yield 1
return '出现异常' # 如改成return 6,则第二个print(next(a))结果为StopIteration: 6
a = funa()
print(next(a)) # 1
print(next(a)) # StopIteration: 出现异常 为异常说明
-----------------------------------------------
3.生成器函数的表达式形式
def funa(n):
for i in range(n):
yield i ** 2
# a = funa(3)
# print(next(a))
# print(next(a))
# print(next(a))
如何创建生成器
生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。
只要把一个列表生成式的[]改成()
li = [i*2 for i in range(3)] # 列表推导式
print(li) # [0, 2, 4]
li2 = (i*2 for i in range(3)) # 生成器表达式
print(li2) # <generator object <genexpr> at 0x000002F099EA2C48>
print(next(li2)) # 0
print(next(li2)) # 2
print(next(li2))
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!