迭代器含义:
1.迭代器一定是可迭代对象,因为迭代器协议中声明,包含__iter__,__next__ 方法的才算迭代器;
可迭代对象的协议是只要包含__iter__的都算是可迭代对象。
2.迭代器对象不可直接打印
生成器:
def func(): for i in range(10): yield i print('hello') f = func() #存入变量生成的迭代器才有意义,因为迭代器不会关闭,可以持续迭代 print(f.__next__()) print(f.__next__())
.send()的运用
1.send()与 next一样的效果,但是多了一个传值的功能;只要yield前面有变量接着,传进去的值就会赋给变量。
2.如果没有变量接着,也不会报错。所以以后就用send,抛弃next了
注意:
1.不能直接用send 调用迭代器。因为,迭代器执行开始时,是没有变量接着的,哪怕第一句就写yield 也不行,因为yield还没运行
1 def init(func): #在调用被装饰生成器函数的时候首先用next激活生成器 2 def inner(*args,**kwargs): 3 g = func(*args,**kwargs) 4 next(g) 5 return g 6 print(g) 7 return inner 8 9 @init 10 def averager(): 11 total = 0.0 12 count = 0 13 average = None 14 while True: 15 term = yield average 16 total += term 17 count += 1 18 average = total/count 19 20 g_avg = averager() 21 print(g_avg.send(10)) 22 print(g_avg.send(30)) 23 print(g_avg.send(5))