生成器yield使用yield语句 可以让函数生成一个结果序列而不仅仅是一个值

def  countdow(n):
     print("Start!");
     while n>0:
          yield n;
          n -= 1;
c = countdow(5);
print(c.__next__()) 
print(c.__next__())


输出结果:

Start!

5
4

__next__()方法使生成器函数一直运行到下一条yield语句为止,此时__next__()方法将返回值传递给了yield并且函数暂时中止执行 再次调用__next__()时 函数继续执行 此过程持续到生成器函数返回结束为止

通常不会手动调用__next__()方法  而是使用循环

for i in  countdow(5):
 print(i);


输出结果:
5
4
3
2
1

生成器是基于处理管道、流或数据流编写程序的一种强大的方式;
如:

def tail(f):  
 for line in f:  
  if not line : #如果 非真 则暂时休眠并且再次尝试
   time.sleep(0.1);
   continue;
  yield line; # 将获取到的文件中的值 生成一个序列的值
filecount = tail(open('E:/work.txt'));

#grep方法 用于在上面方法生成器中查找特定的子字符串  
def grep(lines,searchtext):
 for line in lines:
  if searchtext in line :
   yield  line;
lines  = grep(filecount,'tom');  #查找带有tom 的子字符串
for line in lines: 
 print(line);


输出结果:
'tom',120,132

总结:

生成器的作用:当程序运行到yield时 将运行的值 传递给了yield  程序不会输出 可认为在此时程序处于暂停的状态    当使用__next__()方法的时候 函数继续执行 直至再次遇到yield  

优点:yield存储的并不是单一的值,而是保存当前的程序执行状态 不用一次计算所有的元素 而是用一次算一次 节省内存空间