术语解释
1,迭代器协议:对象需要提供next()方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代。
2,可迭代对象:实现了迭代器协议对象。list、tuple、dict都是Iterable(可迭代对象),但不是Iterator(迭代器对象)。但可以使用内建函数iter(),把这些都变成Iterable(可迭代器对象)。
3,for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束
python内置函数
iter()返回一个定义了next()方法的迭代器对象或者是调用迭代器对象的
__iter__
方法
next()调用迭代器对象的__next__
方法
迭代器
迭代器可以通过list()或tuple()转成列表和元组
Python中一个实现了__iter__方法和__next__
方法的类对象,每次循环这个类对象都会产生一个迭代器
其实每次循环可迭代对象(list,tuple,dic)都会产生一个迭代器
如下案例是计算菲波那切数列的案例
class Fib(object):
def __init__(self, max):
super(Fib, self).__init__()
self.max = max
def __iter__(self):
self.a = 0
self.b = 1
return self
def __next__(self):
fib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return fib
if __name__ == '__main__':
# 20以内的数
fib = Fib(20)
for i in fib:
print(i)
生成器
延迟操作。也就是在需要的时候才产生结果,不是立即产生结果。
使用生成器表达式取代列表推导式可以同时节省 cpu 和 内存。
1.使用yield的函数
2.生成器表达式,a = (i for i in range(10))
,这个a不是元组,而是一个生成器,循环一次后为空,不循环不产生
python内置的一些函数,可以识别这是生成器表达式,外面有一对小括号,就是生成器
time_start = time.time()
result1=sum(a for a in range(54545245))
print(time.time()-time_start) #2.87s
time_start = time.time()
result2=sum([a for a in range(54545245)])
print(time.time()-time_start) #3.36s