迭代器
实现:
- 可迭代对象只需要实现iter方法
- 迭代器还需要实现next方法,使用next访问非迭代器会报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Iterator: def __init__(self,array): self.array = array self.index = 0
def __iter__(self): return self
def __next__(self): if(self.index < len(self.array)): result = self.array[self.index] self.index += 1 return result raise StopIteration
it = Iterator([1,2,3,5,7,9])
for i in it: print(i)
for t in it: print(t)
|
生成器
定义:一边循环一边计算的机制,叫做生成器:generator
生成器的用途:列表所有数据存储在内存中,若数据量过多非常消耗内存。若列表中元素按照某种算法推演出来,那么可以一边循环一边计算后面的元素,而不必生成完整列表,从而节省大量空间。
方法一:
1 2 3 4
| list_ = [x+x for x in range(10)] print(type(list_)) list__ = (x+x for x in range(10)) print(type(list__))
|
方法二:
函数中加yield:yield相当于return一个值,并记住位置,下次调用函数从该yield语句之后执行
send()与next()一样,都可以让generator走一步,但send()可以传一个值,修改上一个yield表达式
如:a = yield 5,第一次运行到这里时返回5,a未被赋值;这时使用.send(10),就会赋10给a
1 2 3 4 5 6 7 8 9 10 11 12
| def yield_test(n): for i in range(n): yield call(i) print("i=",i) print("Done.")
def call(i): return i*2
for i in yield_test(5): print(i,",")
|