首先区分可迭代对象(Iterable)迭代器(Iterator)

  • 可迭代对象:包含__iter__方法的对象为可迭代对象,如List、Tuple、Dictionary
  • 迭代器:包含__iter____next__方法

可迭代对象属于半成品 --> 而迭代器属于直接食用产品

以下均在for 循环遍历中即是根据 iter 方法判断该对象是否是可迭代序列

1. 定义一个可迭代类:

class Iterat():
def __init__(self):
self.arr = [1,2,3]
self.loc = 0
def __iter__(self):
for i in self.arr:
yield i
for i in Iterat():
print(i)
# 进行for循环遍历时,先执行iter方法迭代化,返回一个迭代器对象,迭代器对象含有next方法,接下来通过next遍历

上述定义中,可能出现的报错Error

  1. 类class定义不含__iter__方法(不能识别为可迭代序列)
  2. 类class中iter方法既没有使用 yield 也没有通过 `return self (简单说就是iter方法执行后没有返回迭代器对象)

2. 定义一个标准的迭代器:

2.1 类class生成法:

class Iterat():
def __init__(self):
self.arr = [1,2,3]
self.loc = 0
def __iter__(self):
return self # 返回自身,这里再新建也可,殊途同归
def next(self):
# python 2.7 中写法: next
if self.loc < len(self.arr):
ret = self.arr[self.loc]
self.loc += 1
return ret
else:
raise StopIteration
def __next__(self):
# python 3 以上写法
if self.loc < len(self.arr):
self.loc += 1
return self.arr[self.loc]
else:
raise StopIteration

2.2 yield 生成器法:原理:如果函数中存在yield,该函数将被作为生成器,执行后自动生成一个迭代器,且无需管理StopIteration边界问题

for i in Iterat():执行找iter方法,执行返回了迭代器(编译器自动构造,self不是原有的类),此时class中的next方法不会被执行
class Iterat():
def __init__(self):
self.arr = [1,2,3]
def __iter__(self):
for i in self.arr:
yield i

生成器(Generator)是一种特殊的迭代器,是一种优化使用方式的直接使用产品(无需管理边界问题,负责吃就完事了)

生成器生成函数(GeneratorFunction)不是生成器,是一种工厂函数

gt = ( i for i in range(3))  # 生成器构造语法糖
# 下面例子是一个生成器构造函数,凡是函数有yield,会被作为生成器构造函数处理
def genGT(list):
for item in list :
yield item

最后做一个小实验比较下迭代器(流式读取)与普通读取的差异:(牺牲时间换空间,可以使用shell命令观察内存、cpu变化)

it = ( i for i in range(100000000))
count = 0
s = time.time()
for i in it :
count += i
print(time.time()-s) # 31.8320000172 s list = [ i for i in range(100000000)]
count = 0
s = time.time()
for i in list :
count += i
print(time.time()-s) # 27.4390001297 s

《python-美藏篇》1.可迭代、迭代器与生成器的更多相关文章

  1. Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器

      生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程 ...

  2. Python 入门基础11 --函数基础4 迭代器、生成器、枚举类型

    今日目录: 1.迭代器 2.可迭代对象 3.迭代器对象 4.for循环迭代器 5.生成器 6.枚举对象 一.迭代器: 循环反馈的容器(集合类型) 每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的 ...

  3. Python——五分钟带你弄懂迭代器与生成器,夯实代码能力

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是周一Python专题,给大家带来的是Python当中生成器和迭代器的使用. 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉 ...

  4. python基础-函数之装饰器、迭代器与生成器

    1. 函数嵌套 1.1 函数嵌套调用 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数 def bar(): print("from in the bar.") def f ...

  5. python之路 模块,序列化,迭代器,生成器

    一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过 ...

  6. Python全栈开发之4、迭代器、生成器、装饰器

    一.迭代器 1.为何要有迭代器? 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集合.文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依 ...

  7. 三、python高级特性(切片、迭代、列表生成器、生成器)

    1.python高级特性 1.1切片 list列表 L=['Mli','add','sal','saoo','Lkkl'] L[0:3]  #即为['Mli','add','sal']  从索引0开始 ...

  8. Python三大神器:装饰器,迭代器,生成器

    一.装饰器 由于一个函数能实现一种功能,现在想要在不改变其代码的情况下,让这个函数进化一下,即能保持原来的功能,还能有新的"技能",怎么办? 现已经存在一个自定义的函数func1, ...

  9. Python学习 Day 4 函数 切片 迭代 列表生成式 生成器

    定义函数 def my_abs(x):#求绝对值的my_abs函数 if x >= 0: return x else: return –x def nop():#空函数 pass#占位符 参数检 ...

  10. python中迭代器和生成器

    l=[1,2,3,4] for n in l: print n 在看上面这段代码的时候,我们没有显式的控制列表的偏移量,就可以自动的遍历了整个列表对象.那么for 语句是怎么来遍历列表l的呢?要回答这 ...

随机推荐

  1. 为什么CTR预估使用AUC来评估模型?

    ctr预估简单的解释就是预测用户的点击item的概率.为什么一个回归的问题需要使用分类的方法来评估,这真是一个好问题,尝试从下面几个关键问题去回答. 1.ctr预估是特殊的回归问题 ctr预估的目标函 ...

  2. swift设置导航栏item颜色和状态栏颜色

    //swift设置导航栏item颜色和状态栏颜色 let dict:Dictionary =[NSForegroundColorAttributeName:UIColor.hrgb("333 ...

  3. 视图View,获取视图大小

    一.获得LayoutInflater实例: LayoutInflater layoutInflater=LayoutInflater.from(context); 得到LayoutInflater实例 ...

  4. 锁对象-条件对象-synchronized关键字

    1 import java.util.concurrent.locks.Condition; 2 import java.util.concurrent.locks.Lock; 3 import ja ...

  5. Windows下80端口被占用的解决方法(SQL Server)

    查找80端口被谁占用的方法 进入命令提示行(WIN+R 输入 CMD),输入命令 netstat -ano|findstr 80 (显示包含:80的网络连接) ,就可以看到本机所有端口的使用情况,一般 ...

  6. ICCV2021 | 简单有效的长尾视觉识别新方案:蒸馏自监督(SSD)

    ​  前言  本文提出了一种概念上简单但特别有效的长尾视觉识别的多阶段训练方案,称为蒸馏自监督(Self Supervision to Distillation, SSD).在三个长尾识别基准:Ima ...

  7. <转>git,github在windows上的搭建

    http://www.cnblogs.com/yixiaoyang/archive/2012/01/06/2314190.html Git在源码管理领域目前占很大的比重了,而且开源的项目很多都转到Gi ...

  8. CTF靶场

    CTF靶场测试报告 一.跨站脚本攻击(XSS) 实验原理:跨站脚本攻击( Cross Site Script),本来的缩写应为CSS,但是为了与层叠样式表(Cascading Style CSS)区分 ...

  9. 【分布式技术专题】「OSS中间件系列」Minio的文件服务的存储模型及整合Java客户端访问的实战指南

    Minio的元数据 数据存储 MinIO对象存储系统没有元数据数据库,所有的操作都是对象级别的粒度的,这种做法的优势是: 个别对象的失效,不会溢出为更大级别的系统失效. 便于实现"强一致性& ...

  10. 数据库函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业! 谢谢 下载地址:https://officecommunity- ...