page contents

不会用生成器的看过来

生成器其实没你想象得那么难,本文通过举几个简单的例子帮助大家理解。

在计算机科学中,生成器是特定的迭代器,它完全实现了迭代器接口,所以所有生成器都是迭代器。 不过,迭代器用于从数据集中取出元素;而生成器用于"凭空"生成(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))

  • 发表于 2021-07-14 21:34
  • 阅读 ( 355 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Wilia
Wilia

28 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1324 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章