迭代器和生成器都是访问集合元素的一种方式。
一、迭代器
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
字符串,列表或元组对象都可用于创建迭代器。
1、迭代器有两个基本的方法:
iter() 创建迭代器对象
next() 输出迭代器的下一个元素
from collections.abc import Iterator s = '123' it1 = iter(s) print(isinstance(it1, Iterator)) #判断一个对象是否迭代器对象,输出:True print(next(it1)) #输出:1 print(next(it1)) #输出:2 print(next(it1)) #输出:3 #print(next(it1)) #超出范围会运行报错StopIteration li = [1,2,3] it2 = iter(li) print(next(it2)) #输出:1 print(next(it2)) #输出:2 print(next(it2)) #输出:3 it3 = iter(li) #用list可将迭代器转换为列表 print(list(it3))
2、迭代器遍历的两种方式:for、while
import sys s = '123' it1 = iter(s) for i in it1: print(i) li = [1,2,3] it2 = iter(li) while True: try: print(next(it2)) except StopIteration: sys.exit()
3、把一个类作为迭代器使用:在类中实现__iter__()与 __next__() 方法
# 斐波那契数列 class Fibs: def __init__(self): self.a = 0 self.b = 1 def __next__(self): self.a,self.b = self.b, self.a+self.b return self.a def __iter__(self): return self fibs = Fibs() for f in fibs: if f > 1000: print(f) break
二、生成器
生成器是一种特殊的迭代器,使用了 yield 的函数被称为生成器,即生成器是一个返回迭代器的函数,只能用于迭代操作。
1、创建生成器
# 生成器函数 def Fibs(n): a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1 f = Fibs(6) # f是一个迭代器 print(next(f)) print(next(f)) print(next(f)) #可以用next print(f.__next__()) #也可以用__next__ print(f.__next__()) print(f.__next__()) print(f.__next__()) '''输出: 0 1 1 2 3 5 8 ''' for f in Fibs(6): print(f) '''输出: 0 1 1 2 3 5 8 '''
2、生成器表达式
生成器表达式与列表推导式类似,不同之处是最外层的[]换成(),不立即执行循环,而是返回一个生成器。
r = (i*2 for i in range(5)) print(next(r)) print(next(r)) print(next(r)) print(next(r)) print(next(r)) '''输出: 0 2 4 6 8 ''' ''' 也可以遍历 for i in r: print(i) ''' r2 = sum(i*2 for i in range(5)) print(r2) '''输出: 20 '''