可迭代对象、迭代器和生成器的关系
image.png可迭代对象
可迭代对象实现某种接口,对与列表内部实现了__iter__()
方法,而对于字符串内部并没有__iter__()
方法,而有__getitem__()
也就是说当我们使用iter(x)
迭代一个对象时,先回调用本身的__iter__()
方法,如果没有__iter__()
,有__getitem__()
方法也可以
反向迭代
实现了__reversed__()
方法
迭代器
必须满足迭代对象的条件,而且实现了__next__()
方
class FloatRange(object):
def __init__(self, start, end, step=0.1):
self.start = start
self.end = end
self.step = step
self.flag = start - step
def __iter__(self):
t = self.start
while t <= self.end:
yield t
t += self.step
def __reversed__(self):
t = self.end
while t >= self.start:
yield t
t -= self.step
def __next__(self):
self.flag += self.step
if self.flag > self.end:
raise StopIteration
return self.flag
# 正向迭代
for x in FloatRange(1.0, 2.0, 0.2):
print(x)
# 反向迭代
for x in reversed(FloatRange(1.0, 2.0, 0.2)):
print(x)
# 迭代器
r = FloatRange(0.0, 5.0, 0.5)
print(next(r))
print(next(r))
生成器
Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。
python有两种不同的方式提供生成器:
生成器函数:常规函数定义,但是,使用yield
语句而不是return
语句返回结果。yield
语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
def fibonacci(n):
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10)
生成器表达式:实现了迭代器接口,类似于列表推导,将列表推导中的中括号替换成圆括号,生成器返回的结果一个对象,而不是一次构建完整的列表
squares = (x**2 for x in range(10))
网友评论