迭代器与生成器
迭代器
可迭代对象:只要实现了__iter__()方法,并且该方法返回一个迭代器。
迭代器:是实现了__iter__()和__next__()都是迭代器,iter()返回自身,next()返回下一个值,迭代器一定是可迭代对象。
可迭代对象有:
-
容器类型
-
打开的文件
-
range()
-
迭代器作用:懒加载,不会一次性加载全部,从而消耗大量内存,用的时候才会生成
实现斐波拉契数列迭代器:
#输出斐波拉契数列
class My_Fiboracci():
def __init__(self):
self.first = 1
self.second = 0
self.temp = 0
def __iter__(self):
return self
def __next__(self):
self.temp = self.first+self.second
self.first =self.second
self.second = self.temp
return self.temp
for i in My_Fiboracci():
if i <23:
print(i)
else:
break
运行结果:
1
1
2
3
5
8
13
21
生成器
生成器是特殊的迭代器,为了写迭代器更加简单优雅
1.生成表达式
#生成式表达式
lst = [3,4,5,6,7]
g1 = (x**2 for x in lst)
print(hasattr(g1,'__iter__'))
print(hasattr(g1,'__next__'))
print(g1.__next__())
运行结果:
True
True
9
2.生成器函数
#生成器函数,以yield为关键字
#保留中间算法,下次执行,当调用next时,遇到yield就暂停运行并返回yield后面表达式的值
#当再次调用yield时,会从暂停的地方继续运行,直到遇到下一个yield或生成器结束
def get_content():
print("start yield....")
yield 3
print("second yield....")
yield 4
print("end....")
g1 = get_content()
print(hasattr(g1,'__iter__'))
print(hasattr(g1,'__next__'))
print(next(g1))
print(next(g1))
print(next(g1))
print(next(g1))
运行结果:
StopIteration
True
True
start yield....
3
second yield....
4
end....
迭代器,迭代对象,生成器关系图:
hon
StopIteration
True
True
start yield…
3
second yield…
4
end…
迭代器,迭代对象,生成器关系图:
