迭代器含义:

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))