迭代器和生成器

迭代器 iterator

(1) 迭代对象:

可以直接作用于for循环的 称为可迭代对象(iterable)可以通过 isinstance 判断是否属于可迭代对象

可以直接作用于for循环的数据类型为:

  1. 列表,字典,集合,元组,字符串...

  2. generator 带yield的函数

实例 判断哪些是可迭代对象

 
from collections import Iterable
print(isinstance('',Iterable)) #True
print(isinstance(1,Iterable)) #False
print(isinstance(True,Iterable)) #False
print(isinstance([],Iterable)) #True
print(isinstance(1.1,Iterable)) #False
print(isinstance((),Iterable)) #True
print(isinstance(set(),Iterable)) #True
 
(2) 迭代器 iterator
  1. 是快速访问集合的一种方式

  2. 迭代器提供了俩个方法 iter() 和 next()

  3. 迭代器在访问的时候 只能前进 不能后退

  4. 当数据被访问完以后 再次访问 则会抛出 StopIteration的错误

  5. 迭代器的前提 必须是一个可迭代对象

  6. 称为迭代器以后 增加了next方法进行取值 并且依然支持for循环

判断当前是否属于迭代器:

from collections import Iterator
print(isinstance([],Iterator))  #False
print(isinstance(iter([]),Iterator))  #True
 

生成器 generator

  1. 带有yield 的函数

  2. 使用列表推导式 外层使用小括号 称之为生成器

  3. 生成器 也能够使用 迭代器的 next方法 生成器也实现了迭代器的功能

(1) 使用列表推导式生成的生成器

可以使用next 并且 可以作用于for循环

myList = (x for x in range(100000000000)) #generator
用一个生产一个 并不是一次性的全部生产出来 节约资源
from collections import Iterator,Generator
myList = (x for x in range(100000000000)) #generator
myList = (x for x in range(3)) #generator
print(isinstance(myList,Iterator)) #True
print(isinstance(myList,Generator)) #True
 

(2) 带yield的函数

  1. yield

  2. next()

生成器的拆分 (后期的协程 就是基于当前的生成器 只是可以之间通过send方法进行通信 节省资源的开销 因为是单进程单线程)

 
 
#生成器拆分
def func():
    print(1)
    yield 'a'
    print(2)
    yield 'b'
    
f = func()
# print(f)
print(next(f))
print(next(f))
print(next(f))
 

每次调用next 会执行到下一个yield 位置并停止 将yield的值 进行返回

最新文章

  1. optparse
  2. Linux中常用操作命令
  3. 学习swift开源项目
  4. 给Android程序员的六个建议
  5. ThinkPHP技巧
  6. UVA 10341 二分搜索
  7. hasLayout与Block formatting contexts的学习(下)
  8. UIView animateWithDuration 使用详解
  9. 打造基于Clang LibTooling的iOS自动打点系统CLAS(一)
  10. Java项目中使用Redis缓存案例
  11. RabbitMQ安装使用详解
  12. C# WebService创建与使用
  13. 论文阅读(Weilin Huang——【ECCV2016】Detecting Text in Natural Image with Connectionist Text Proposal Network)
  14. ubuntu系统安装mysql(deb-bundle包)
  15. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)
  16. db2 表空间容量
  17. Spring Boot中application.yml与bootstrap.yml的区别(转载)
  18. P2607 [ZJOI2008]骑士
  19. [正经分析] DAG上dp两种做法的区别——拓扑序与SPFA
  20. 一道money计算题引发的思考

热门文章

  1. 10.19-10.20 test
  2. 怎样使用alsa API
  3. Long转换为date
  4. jmeter使用笔记——流程及常用组件配置
  5. (转)Java经典设计模式(3):十一种行为型模式(附实例和详解)
  6. [Tyvj Aug11] 黄金矿工
  7. yii表单的各种验证
  8. Python: PS滤镜--径向模糊
  9. BZOJ_4809_皇后_爆搜
  10. OTL之Oracle开发总结《转》