一、生成器
有两种方法生成迭代器
1、把一个列表生成式的[]改成()
1 it = (x*x for x in range(10)) 2 print (it) #<generator object <genexpr> at 0x02CEAF60> 3 print (next(it)) #调用生成器的内部next方法 4 print (next(it))
2、在函数中使用yield关键字,使函数变成一个生成器。
最简单生成器
1 def foo():
2 print ('t1')
3 yield 1 # 迭代器的返回值
4 print ('t2')
5 yield 2 # 迭代器返回第二个值
6
7 f = foo()
8 next(f) #在python3中调用next方法,获取生成器返回值
9 next(f)
10 next(f) #超过迭代范围,返回StopIteration异常
使用send方法向生成器传参数
1 def bar(): 2 print ('test content1...') 3 var = yield 1 4 print ('test content2...') 5 print (var) 6 yield 2 7 b = bar() 8 print (b.send(None)) 9 print (b.send('test_var')) 10 # 11 # test content1... 12 # 1 #第一次yield回来的值 13 # test content2... 14 # test_var #第二次send才能船传值,且在第一个yield时接收 15 # 2 #第二次yield回来的值。
二、 迭代器
Python的迭代协议要求一个 __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
1 it = iter([1,2,3]) #使用iter()函数创建迭代器。 2 print (next(it)) 3 print (next(it)) 4 print (next(it)) 5 print (next(it)) #迭代器的值都已经返回,再次调用就会报错StopIteration异常。
for循环的内部在干什么?
class Bar: def __init__(self, n): self.n = n def __iter__(self): return self def __next__(self): if self.n == 8: raise StopIteration('no n number!!!!') self.n += 1 return (self.n) b = Bar(4) print (next(b)) print (next(b)) print (next(b)) print (next(b)) print (next(b)) # for i in Bar(0): # print (i)