迭代器
-
能用for… in 遍历的叫可迭代对象
-
for in 每一次都会调用__next__方法 获取返回值
-
在for… in 循环中 记录我们遍历到第几次的对象就是迭代器
-
一个具备了__iter__方法的对象,就是一个可迭代对象。
-
简单来说计数君就是迭代器 迭代器需要迭代对象提供
-
迭代器中的数据是一次性的
-
for in 用时间换空间
-
迭代器用空间换时间
-
因为迭代去需要一直next()
class Demo(object):
def __init__(self,x):
self.x = x
self.count = 0 实例化的计数man
def __iter__(self):
return self 返回实例化的可迭代对象
#for in 每一次都会调用__next__方法 获取返回值
def __next__(self):
self.count+=1
if self.count<=self.x:
print("我是count", self.count)
return self.count-1
else:
print("我是count",self.count)
raise StopIteration#终止迭代器
d1 = Demo(8) # 只要重写了 __iter__方法他就是可迭代对象 可以使用for in
test = d1.__iter__() # 这样就获取到对象的迭代器
迭代器生成斐波那契数列
class Fact(object):
def __init__(self,num:int):
self.num = num
self.num1 = 0
self.num2 = 1
self.count = 0
def __iter__(self):
return self
def __next__(self):
self.count +=1
if self.count <= self.num:
#x 存放最后的结果
x = self.num2
self.num1,self.num2 =self.num2,self.num1+self.num2
return x
else:
raise StopIteration
f = Fact(10)#占时间 不占空间
z = 0
for i in f:
z = i
print(z)
print(next(iter(z)) 等价于 print((f.__iter__()).__next__()) 这样一次只能拿一个值要拿多少个要写多少次 占用空间不占用时间
生成器
- 生成器(generator)。生成器是一类特殊的迭代器。
- 把列表生成式的[ ]括号改成( )括号就是生成器
- 迭代器是一个对象 通过class定义
生成器 写法像函数 - 只要在def中有yield关键字的 就称为 生成器
- yield关键字有两点作用:
保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
def my_gemerator(n:int):
i = 0
while i <n:
yield i #将函数变成了生成器 本来我们的函数是用return 表示函数结束 但是现在通过yield
i +=1
-
将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
-
可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)
-
Python3中的生成器可以使用return返回最终运行的返回值,而Python2中的生成器不允许使用return返回一个返回值(即可以使用return从生成器中退出,但return后不能有任何表达式)。