生成器基本概念

1 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束

2 生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存,所以生成器可以用在需要节省内存的场景

3 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器函数

4 next( generator object) 可以用于获取生成器返回的值

例子

def test():

i = 0

while True:

yield i

i += 1

I = test()

print (next(I))
print (next(I))

也可以用下面方式迭代,效果一样

print( I.next() )
print( I.next() )

注意: 直接

print( next(test()) )
print ( next(test()) )

是错误的,因为是俩个实例,所以输出都会是0

yield 与 return

在一个生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration;
如果遇到return,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。

如果在return后返回一个值,那么这个值为StopIteration异常的说明,不是程序的返回值

def test():

i = 0

while True:

yield i

i += 1

if i > 5:

break

print( I.next() )
print( I.next() )
print( I.next() )
print( I.next() )
print( I.next() )
print( I.next() )
print( I.next() )

输出

0
1
2
3
4
5

Traceback (most recent call last):
File "C:\string.bak.py", line 31, in <module>
print( I.next() )
StopIteration

生成器支持的方法

>>> help(odd_num)

Help on generator object:
 
odd = class generator(object)
|  Methods defined here:
......
|  close(...)
|      close() -> raise GeneratorExit inside generator.
|
|  send(...)
|      send(arg) -> send 'arg' into generator,
|      return next yielded value or raise StopIteration.
|
|  throw(...)
|      throw(typ[,val[,tb]]) -> raise exception in generator,
|      return next yielded value or raise StopIteration.
......
 
close方法
手动关闭生成器函数,后面的调用会直接返回StopIteration异常
 
next方法

对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。

然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数,

后面再次调用next,依次类推

 
 
 
 
 
 
 
 
 

最新文章

  1. 使用IHTMLDocument2解决弹出&quot;为了让该网站给你提供个人化信息,是否允许在你计算机放置cookie?&quot;
  2. 第7章 权限管理(1)_ACL权限
  3. MAC air 安装redis-3.0.6
  4. IIS7 IIS7.5 配置备份
  5. linux添加字体的过程
  6. Linux 批量解压gz包
  7. C#算法基础之递归排序
  8. 百度参投 Uber中国12亿美元融资已到账
  9. hdu3999The order of a Tree (二叉平衡树(AVL))
  10. ProvissyTool Update Support Page
  11. NHProfiler使用方法
  12. 【卸载】oracle卸载
  13. mysql4 - 高级操作
  14. java定时任务调度-Timer(1)
  15. (七) Keras 绘制网络结构和cpu,gpu切换
  16. C++回顾day03---&lt;输入输出流&gt;
  17. 聊聊Google DSM产品的发布
  18. RabbitMQ管理界面
  19. mysql.user表中Host为%的含义
  20. LeetCode--283--移动0

热门文章

  1. 前端开发 Vue -3axios
  2. 如何禁止Chrome浏览器隐藏URL的WWW前缀
  3. 听课笔记--DP--Authentication Failed
  4. 解决tensorflow 调用bug Running model failed:Invalid argument: NodeDef mentions attr &#39;dilations&#39; not in Op&lt;name=Conv2D; signature=input:T, filter:T -&gt;
  5. 03 Django之视图函数
  6. linux服务脚本
  7. MySQL Windows安装连接
  8. Signal Processing and Pattern Recognition in Vision_15_RANSAC:Random Sample Consensus——1981
  9. libssh
  10. 机器学习中的数学-强大的矩阵奇异值分解(SVD)及其应用