《python-美藏篇》-- 可迭代、迭代器与生成器
首先区分可迭代对象(Iterable)、迭代器(Iterator)
- 可迭代对象:包含__iter__方法的对象为可迭代对象,如List、Tuple、Dictionary
- 迭代器:包含__iter__、__next__方法
可迭代对象属于半成品 --> 而迭代器属于直接食用产品,生成器属于特殊的迭代器,生成器函数执行后会返回生成器
以上类型判断方法
from collections import Iterator,Iterable
from inspect import isgenerator , isgeneratorfunction
print(isgenerator(g),isinstance(g ,Iterator))
print(isgenerator(it1) , isgenerator(iter(it1)),isinstance(it1,Iterator))
以下均在for 循环遍历中即是根据 iter 方法判断该对象是否是可迭代序列
-
- 定义一个可迭代类
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.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
作者:365/24/60
链接:https://www.cnblogs.com/lhx9527/p/15756056.html
来源:博客园
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
超全面的测试IT技术课程,0元立即加入学习!有需要的朋友戳:
腾讯课堂测试技术学习地址
作者:蓝寅
出处:https://www.cnblogs.com/dream66/
欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。
腾讯课堂测试技术学习地址
作者:蓝寅
出处:https://www.cnblogs.com/dream66/
欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。